[Top][All Lists]
[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] pmt/src/lib pmt.cc pmt_int.h qa_pmt_prims.cc qa...,
Eric Blossom <=