Additional QA for tuple.
authorEric Blossom <eb@comsec.com>
Sat, 15 Aug 2009 08:02:15 +0000 (01:02 -0700)
committerEric Blossom <eb@comsec.com>
Sat, 15 Aug 2009 08:02:15 +0000 (01:02 -0700)
gruel/src/lib/pmt/pmt.cc
gruel/src/lib/pmt/pmt_io.cc
gruel/src/lib/pmt/qa_pmt_prims.cc

index 8bf5b2dea51069f46698cb03ee9da2fd8c1be308..20dc4e42c403014b37d0f36fcbebd9a2889dea32 100644 (file)
@@ -673,20 +673,21 @@ pmt_to_tuple(const pmt_t &x)
 
   size_t len = pmt_length(x);
   pmt_tuple *t = new pmt_tuple(len);
+  pmt_t r = pmt_t(t);
 
   if (x->is_vector()){
     for (size_t i = 0; i < len; i++)
       t->_set(i, _vector(x)->ref(i));
-    return pmt_t(t);
+    return r;
   }
 
   if (x->is_pair()){
     pmt_t y = x;
     for (size_t i = 0; i < len; i++){
       t->_set(i, pmt_car(y));
-      y = pmt_cdr(x);
+      y = pmt_cdr(y);
     }
-    return pmt_t(t);
+    return r;
   }
 
   throw pmt_wrong_type("pmt_to_tuple", x);
@@ -928,6 +929,19 @@ pmt_equal(const pmt_t& x, const pmt_t& y)
     return true;
   }
 
+  if (x->is_tuple() && y->is_tuple()){
+    pmt_tuple *xv = _tuple(x);
+    pmt_tuple *yv = _tuple(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;
+  }
+
   if (x->is_uniform_vector() && y->is_uniform_vector()){
     pmt_uniform_vector *xv = _uniform_vector(x);
     pmt_uniform_vector *yv = _uniform_vector(y);
index f5a82de0e020e07cea3bbba01b6e6a4cb317756f..fbc556ab044eb99ef9189f99fcd5e2e1aea7075f 100644 (file)
@@ -90,6 +90,11 @@ pmt_write(pmt_t obj, std::ostream &port)
     // port << "#<vector " << obj << ">";
     port << "#<vector>";
   }
+  else if (pmt_is_tuple(obj)){
+    // FIXME
+    // port << "#<tuple " << obj << ">";
+    port << "#<tuple>";
+  }
   else if (pmt_is_uniform_vector(obj)){
     // FIXME
     // port << "#<uniform-vector " << obj << ">";
index d31e3fabf47e15b6cf36154249d954a7a32fecb8..cf1ee0142206aafc74fbb10b3f57d929b0f4c660 100644 (file)
@@ -207,14 +207,13 @@ check_tuple(size_t len, const std::vector<pmt_t> &s, pmt_t t)
 void
 qa_pmt_prims::test_tuples()
 {
-  pmt_t t0 = pmt_make_tuple();
-  CPPUNIT_ASSERT_EQUAL(size_t(0), pmt_length(t0));
-
+  pmt_t v = pmt_make_vector(10, PMT_NIL);
   std::vector<pmt_t> s(10);
   for (size_t i = 0; i < 10; i++){
     std::ostringstream os;
     os << "s" << i;
     s[i] = pmt_string_to_symbol(os.str());
+    pmt_vector_set(v, i, s[i]);
   }
 
   pmt_t t;
@@ -254,6 +253,20 @@ qa_pmt_prims::test_tuples()
 
   t = pmt_make_tuple(s[0], s[1], s[2]);
   CPPUNIT_ASSERT_THROW(pmt_tuple_ref(t, 3), pmt_out_of_range);
+
+  t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
+  check_tuple(10, s, t);
+
+  pmt_t t2 = pmt_to_tuple(v);
+  CPPUNIT_ASSERT_EQUAL(size_t(10), pmt_length(v));
+  CPPUNIT_ASSERT(pmt_equal(t, t2));
+  
+  t = pmt_make_tuple(s[0], s[1], s[2]);
+  pmt_t list0 = pmt_list3(s[0], s[1], s[2]);
+  CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(list0));
+  t2 = pmt_to_tuple(list0);
+  CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(t2));
+  CPPUNIT_ASSERT(pmt_equal(t, t2));
 }
 
 void