commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] pmt/src/lib pmt.cc pmt_int.h qa_pmt_prims.cc qa...


From: Eric Blossom
Subject: [Commit-gnuradio] pmt/src/lib pmt.cc pmt_int.h qa_pmt_prims.cc qa...
Date: Tue, 04 Jul 2006 20:15:16 +0000

CVSROOT:        /sources/gnuradio
Module name:    pmt
Changes by:     Eric Blossom <eb>       06/07/04 20:15:16

Modified files:
        src/lib        : pmt.cc pmt_int.h qa_pmt_prims.cc qa_pmt_prims.h 

Log message:
        vectors, equivalence predicates and QA code

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pmt/src/lib/pmt.cc?cvsroot=gnuradio&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pmt/src/lib/pmt_int.h?cvsroot=gnuradio&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pmt/src/lib/qa_pmt_prims.cc?cvsroot=gnuradio&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pmt/src/lib/qa_pmt_prims.h?cvsroot=gnuradio&r1=1.1&r2=1.2

Patches:
Index: pmt.cc
===================================================================
RCS file: /sources/gnuradio/pmt/src/lib/pmt.cc,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- pmt.cc      4 Jul 2006 18:19:19 -0000       1.3
+++ pmt.cc      4 Jul 2006 20:15:16 -0000       1.4
@@ -85,6 +85,12 @@
   return dynamic_cast<pmt_pair*>(x.get());
 }
 
+static pmt_vector *
+_vector(pmt_t x)
+{
+  return dynamic_cast<pmt_vector*>(x.get());
+}
+
 ////////////////////////////////////////////////////////////////////////////
 //                           Booleans
 ////////////////////////////////////////////////////////////////////////////
@@ -348,3 +354,141 @@
   else
     throw pmt_wrong_type("pmt_set_cdr", pair);
 }
+
+////////////////////////////////////////////////////////////////////////////
+//                             Vectors
+////////////////////////////////////////////////////////////////////////////
+
+pmt_vector::pmt_vector(size_t len, pmt_t fill)
+  : d_v(len)
+{
+  for (size_t i = 0; i < len; i++)
+    d_v[i] = fill;
+}
+
+pmt_t
+pmt_vector::ref(size_t k) const
+{
+  if (k >= length())
+    throw pmt_out_of_range("pmt_vector_ref", pmt_from_long(k));
+  return d_v[k];
+}
+
+void
+pmt_vector::set(size_t k, pmt_t obj)
+{
+  if (k >= length())
+    throw pmt_out_of_range("pmt_vector_set", pmt_from_long(k));
+  d_v[k] = obj;
+}
+
+void
+pmt_vector::fill(pmt_t obj)
+{
+  for (size_t i = 0; i < length(); i++)
+    d_v[i] = obj;
+}
+
+bool
+pmt_is_vector(pmt_t obj)
+{
+  return obj->is_vector();
+}
+
+pmt_t
+pmt_make_vector(size_t k, pmt_t fill)
+{
+  return pmt_t(new pmt_vector(k, fill));
+}
+
+pmt_t
+pmt_vector_ref(pmt_t vector, size_t k)
+{
+  if (!vector->is_vector())
+    throw pmt_wrong_type("pmt_vector_ref", vector);
+  return _vector(vector)->ref(k);
+}
+
+void
+pmt_vector_set(pmt_t vector, size_t k, pmt_t obj)
+{
+  if (!vector->is_vector())
+    throw pmt_wrong_type("pmt_vector_set", vector);
+  _vector(vector)->set(k, obj);
+}
+
+void
+pmt_vector_fill(pmt_t vector, pmt_t obj)
+{
+  if (!vector->is_vector())
+    throw pmt_wrong_type("pmt_vector_set", vector);
+  _vector(vector)->fill(obj);
+}
+
+////////////////////////////////////////////////////////////////////////////
+//                          General Functions
+////////////////////////////////////////////////////////////////////////////
+
+bool
+pmt_eq(pmt_t x, pmt_t y)
+{
+  return x == y;
+}
+
+bool
+pmt_eqv(pmt_t x, pmt_t y)
+{
+  if (x == y)
+    return true;
+
+  if (x->is_integer() && y->is_integer())
+    return _integer(x)->value() == _integer(y)->value();
+
+  if (x->is_real() && y->is_real())
+    return _real(x)->value() == _real(y)->value();
+
+  if (x->is_complex() && y->is_complex())
+    return _complex(x)->value() == _complex(y)->value();
+
+  return false;
+}
+
+bool
+pmt_equal(pmt_t x, pmt_t y)
+{
+  if (pmt_eqv(x, y))
+    return true;
+
+  if (x->is_pair() && y->is_pair())
+    return pmt_equal(pmt_car(x), pmt_car(y)) && pmt_equal(pmt_cdr(x), 
pmt_cdr(y));
+
+  if (x->is_vector() && y->is_vector()){
+    pmt_vector *xv = _vector(x);
+    pmt_vector *yv = _vector(y);
+    if (xv->length() != yv->length())
+      return false;
+
+    for (unsigned i = 0; i < xv->length(); i++)
+      if (!pmt_equal(xv->_ref(i), yv->_ref(i)))
+       return false;
+
+    return true;
+  }
+
+  // FIXME add other cases here...
+
+  return false;
+}
+
+size_t
+pmt_length(pmt_t x)
+{
+  if (x->is_vector())
+    return _vector(x)->length();
+
+  // FIXME list length
+  // FIXME uniform vector length
+  // FIXME dictionary length (number of entries)
+
+  throw pmt_wrong_type("pmt_length", x);
+}

Index: pmt_int.h
===================================================================
RCS file: /sources/gnuradio/pmt/src/lib/pmt_int.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- pmt_int.h   4 Jul 2006 03:49:36 -0000       1.2
+++ pmt_int.h   4 Jul 2006 20:15:16 -0000       1.3
@@ -49,6 +49,7 @@
   virtual bool is_complex() const { return false; }
   virtual bool is_null()    const { return false; }
   virtual bool is_pair()    const { return false; }
+  virtual bool is_vector()  const { return false; }
 };
 
 class pmt_bool : public pmt_base
@@ -139,4 +140,21 @@
   void set_cdr(pmt_t cdr) { d_cdr = cdr; }
 };
 
+class pmt_vector : public pmt_base
+{
+  std::vector<pmt_t>   d_v;
+
+public:
+  pmt_vector(size_t len, pmt_t fill);
+  //~pmt_vector();
+
+  bool is_vector() const { return true; }
+  pmt_t ref(size_t k) const;
+  void  set(size_t k, pmt_t obj);
+  void  fill(pmt_t fill);
+  size_t length() const { return d_v.size(); }
+
+  pmt_t _ref(size_t k) const { return d_v[k]; }
+};
+
 #endif /* INCLUDED_PMT_INT_H */

Index: qa_pmt_prims.cc
===================================================================
RCS file: /sources/gnuradio/pmt/src/lib/qa_pmt_prims.cc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- qa_pmt_prims.cc     4 Jul 2006 18:19:19 -0000       1.1
+++ qa_pmt_prims.cc     4 Jul 2006 20:15:16 -0000       1.2
@@ -155,3 +155,77 @@
   CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type);
   CPPUNIT_ASSERT_THROW(pmt_set_cdr(s1, PMT_NIL), pmt_wrong_type);
 }
+
+void
+qa_pmt_prims::test_vectors()
+{
+  static const size_t N = 3;
+  pmt_t v1 = pmt_make_vector(N, PMT_NIL);
+  CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1));
+  pmt_t s0 = pmt_string_to_symbol("s0");
+  pmt_t s1 = pmt_string_to_symbol("s1");
+  pmt_t s2 = pmt_string_to_symbol("s2");
+
+  pmt_vector_set(v1, 0, s0);
+  pmt_vector_set(v1, 1, s1);
+  pmt_vector_set(v1, 2, s2);
+
+  CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, 0));
+  CPPUNIT_ASSERT_EQUAL(s1, pmt_vector_ref(v1, 1));
+  CPPUNIT_ASSERT_EQUAL(s2, pmt_vector_ref(v1, 2));
+
+  CPPUNIT_ASSERT_THROW(pmt_vector_ref(v1, N), pmt_out_of_range);
+  CPPUNIT_ASSERT_THROW(pmt_vector_set(v1, N, PMT_NIL), pmt_out_of_range);
+
+  pmt_vector_fill(v1, s0);
+  for (size_t i = 0; i < N; i++)
+    CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i));
+}
+
+void
+qa_pmt_prims::test_equivalence()
+{
+  pmt_t s0 = pmt_string_to_symbol("s0");
+  pmt_t s1 = pmt_string_to_symbol("s1");
+  pmt_t s2 = pmt_string_to_symbol("s2");
+  pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
+  pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
+  pmt_t i0 = pmt_from_long(42);
+  pmt_t i1 = pmt_from_long(42);
+  pmt_t r0 = pmt_from_double(42);
+  pmt_t r1 = pmt_from_double(42);
+  pmt_t r2 = pmt_from_double(43);
+
+  CPPUNIT_ASSERT(pmt_eq(s0, s0));
+  CPPUNIT_ASSERT(!pmt_eq(s0, s1));
+  CPPUNIT_ASSERT(pmt_eqv(s0, s0));
+  CPPUNIT_ASSERT(!pmt_eqv(s0, s1));
+
+  CPPUNIT_ASSERT(pmt_eqv(i0, i1));
+  CPPUNIT_ASSERT(pmt_eqv(r0, r1));
+  CPPUNIT_ASSERT(!pmt_eqv(r0, r2));
+  CPPUNIT_ASSERT(!pmt_eqv(i0, r0));
+
+  CPPUNIT_ASSERT(!pmt_eq(list0, list1));
+  CPPUNIT_ASSERT(!pmt_eqv(list0, list1));
+  CPPUNIT_ASSERT(pmt_equal(list0, list1));
+
+  pmt_t v0 = pmt_make_vector(3, s0);
+  pmt_t v1 = pmt_make_vector(3, s0);
+  pmt_t v2 = pmt_make_vector(4, s0);
+  CPPUNIT_ASSERT(!pmt_eqv(v0, v1));
+  CPPUNIT_ASSERT(pmt_equal(v0, v1));
+  CPPUNIT_ASSERT(!pmt_equal(v0, v2));
+
+  pmt_vector_set(v0, 0, list0);
+  pmt_vector_set(v0, 1, list0);
+  pmt_vector_set(v1, 0, list1);
+  pmt_vector_set(v1, 1, list1);
+  CPPUNIT_ASSERT(pmt_equal(v0, v1));
+}
+
+void
+qa_pmt_prims::test_misc()
+{
+  CPPUNIT_ASSERT_THROW(pmt_length(PMT_NIL), pmt_wrong_type);
+}

Index: qa_pmt_prims.h
===================================================================
RCS file: /sources/gnuradio/pmt/src/lib/qa_pmt_prims.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- qa_pmt_prims.h      4 Jul 2006 18:19:19 -0000       1.1
+++ qa_pmt_prims.h      4 Jul 2006 20:15:16 -0000       1.2
@@ -34,6 +34,9 @@
   CPPUNIT_TEST(test_reals);
   CPPUNIT_TEST(test_complexes);
   CPPUNIT_TEST(test_pairs);
+  CPPUNIT_TEST(test_vectors);
+  CPPUNIT_TEST(test_equivalence);
+  CPPUNIT_TEST(test_misc);
   CPPUNIT_TEST_SUITE_END();
 
  private:
@@ -43,7 +46,9 @@
   void test_reals();
   void test_complexes();
   void test_pairs();
-
+  void test_vectors();
+  void test_equivalence();
+  void test_misc();
 };
 
 #endif /* INCLUDED_QA_PMT_PRIMS_H */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]