merged interim/pmt r2248:HEAD into trunk
[debian/gnuradio] / pmt / src / lib / pmt.cc
index a1569e414f45dde916763206e2207a43d6407f43..12c692867a430c8f9df702ed91a6ccd13a42797a 100644 (file)
@@ -91,6 +91,12 @@ _vector(pmt_t x)
   return dynamic_cast<pmt_vector*>(x.get());
 }
 
+static pmt_uniform_vector *
+_uniform_vector(pmt_t x)
+{
+  return dynamic_cast<pmt_uniform_vector*>(x.get());
+}
+
 static pmt_dict *
 _dict(pmt_t x)
 {
@@ -431,6 +437,32 @@ pmt_vector_fill(pmt_t vector, pmt_t obj)
   _vector(vector)->fill(obj);
 }
 
+////////////////////////////////////////////////////////////////////////////
+//                       Uniform Numeric Vectors
+////////////////////////////////////////////////////////////////////////////
+
+bool
+pmt_is_uniform_vector(pmt_t x)
+{
+  return x->is_uniform_vector();
+}
+
+const void *
+pmt_uniform_vector_elements(pmt_t vector, size_t &len)
+{
+  if (!vector->is_uniform_vector())
+    throw pmt_wrong_type("pmt_uniform_vector_elements", vector);
+  return _uniform_vector(vector)->uniform_elements(len);
+}
+
+void *
+pmt_uniform_vector_writeable_elements(pmt_t vector, size_t &len)
+{
+  if (!vector->is_uniform_vector())
+    throw pmt_wrong_type("pmt_uniform_vector_writeable_elements", vector);
+  return _uniform_vector(vector)->uniform_writeable_elements(len);
+}
+
 ////////////////////////////////////////////////////////////////////////////
 //                            Dictionaries
 ////////////////////////////////////////////////////////////////////////////
@@ -602,6 +634,21 @@ pmt_equal(pmt_t x, pmt_t y)
     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);
+    if (xv->length() != yv->length())
+      return false;
+
+    size_t len_x, len_y;
+    if (memcmp(xv->uniform_elements(len_x),
+              yv->uniform_elements(len_y),
+              len_x) == 0)
+      return true;
+
+    return true;
+  }
+
   // FIXME add other cases here...
 
   return false;
@@ -613,8 +660,10 @@ pmt_length(pmt_t x)
   if (x->is_vector())
     return _vector(x)->length();
 
+  if (x->is_uniform_vector())
+    return _uniform_vector(x)->length();
+
   // FIXME list length
-  // FIXME uniform vector length
   // FIXME dictionary length (number of entries)
 
   throw pmt_wrong_type("pmt_length", x);
@@ -703,3 +752,4 @@ pmt_reverse_x(pmt_t list)
   // FIXME do it destructively
   return pmt_reverse(list);
 }
+