summaryrefslogtreecommitdiff
path: root/gruel
diff options
context:
space:
mode:
Diffstat (limited to 'gruel')
-rw-r--r--gruel/src/include/gruel/msg_accepter.h4
-rw-r--r--gruel/src/include/gruel/msg_passing.h20
-rw-r--r--gruel/src/include/gruel/pmt.h52
-rw-r--r--gruel/src/include/gruel/pmt_sugar.h6
-rw-r--r--gruel/src/lib/pmt/pmt.cc42
-rw-r--r--gruel/src/lib/pmt/pmt_serialize.cc344
-rw-r--r--gruel/src/lib/pmt/qa_pmt_prims.cc21
-rw-r--r--gruel/src/lib/pmt/unv_template.cc.t19
-rwxr-xr-xgruel/src/python/qa_pmt.py76
-rw-r--r--gruel/src/swig/CMakeLists.txt2
-rw-r--r--gruel/src/swig/pmt_swig.i101
11 files changed, 617 insertions, 70 deletions
diff --git a/gruel/src/include/gruel/msg_accepter.h b/gruel/src/include/gruel/msg_accepter.h
index 2dc1a6859..45acb3c78 100644
--- a/gruel/src/include/gruel/msg_accepter.h
+++ b/gruel/src/include/gruel/msg_accepter.h
@@ -37,13 +37,13 @@ namespace gruel {
virtual ~msg_accepter();
/*!
- * \brief send \p msg to \p msg_accepter
+ * \brief send \p msg to \p msg_accepter on port \p which_port
*
* Sending a message is an asynchronous operation. The \p post
* call will not wait for the message either to arrive at the
* destination or to be received.
*/
- virtual void post(pmt::pmt_t msg) = 0;
+ virtual void post(pmt::pmt_t which_port, pmt::pmt_t msg) = 0;
};
typedef boost::shared_ptr<msg_accepter> msg_accepter_sptr;
diff --git a/gruel/src/include/gruel/msg_passing.h b/gruel/src/include/gruel/msg_passing.h
index 0cc0cd111..25f30118f 100644
--- a/gruel/src/include/gruel/msg_passing.h
+++ b/gruel/src/include/gruel/msg_passing.h
@@ -36,6 +36,7 @@ namespace gruel {
* \brief send message to msg_accepter
*
* \param accepter is the target of the send.
+ * \param which_port A pmt symbol describing the port by name.
* \param msg is the message to send. It's usually a pmt tuple.
*
* Sending a message is an asynchronous operation. The \p send
@@ -45,9 +46,9 @@ namespace gruel {
* \returns msg
*/
static inline pmt::pmt_t
- send(msg_accepter_sptr accepter, const pmt::pmt_t &msg)
+ send(msg_accepter_sptr accepter, const pmt::pmt_t &which_port, const pmt::pmt_t &msg)
{
- accepter->post(msg);
+ accepter->post(which_port, msg);
return msg;
}
@@ -55,6 +56,7 @@ namespace gruel {
* \brief send message to msg_accepter
*
* \param accepter is the target of the send.
+ * \param which_port A pmt symbol describing the port by name.
* \param msg is the message to send. It's usually a pmt tuple.
*
* Sending a message is an asynchronous operation. The \p send
@@ -64,9 +66,9 @@ namespace gruel {
* \returns msg
*/
static inline pmt::pmt_t
- send(msg_accepter *accepter, const pmt::pmt_t &msg)
+ send(msg_accepter *accepter, const pmt::pmt_t &which_port, const pmt::pmt_t &msg)
{
- accepter->post(msg);
+ accepter->post(which_port, msg);
return msg;
}
@@ -74,6 +76,7 @@ namespace gruel {
* \brief send message to msg_accepter
*
* \param accepter is the target of the send.
+ * \param which_port A pmt symbol describing the port by name.
* \param msg is the message to send. It's usually a pmt tuple.
*
* Sending a message is an asynchronous operation. The \p send
@@ -83,9 +86,9 @@ namespace gruel {
* \returns msg
*/
static inline pmt::pmt_t
- send(msg_accepter &accepter, const pmt::pmt_t &msg)
+ send(msg_accepter &accepter, const pmt::pmt_t &which_port, const pmt::pmt_t &msg)
{
- accepter.post(msg);
+ accepter.post(which_port, msg);
return msg;
}
@@ -93,6 +96,7 @@ namespace gruel {
* \brief send message to msg_accepter
*
* \param accepter is the target of the send. precond: pmt_is_msg_accepter(accepter)
+ * \param which_port A pmt symbol describing the port by name.
* \param msg is the message to send. It's usually a pmt tuple.
*
* Sending a message is an asynchronous operation. The \p send
@@ -102,9 +106,9 @@ namespace gruel {
* \returns msg
*/
static inline pmt::pmt_t
- send(pmt::pmt_t accepter, const pmt::pmt_t &msg)
+ send(pmt::pmt_t accepter, const pmt::pmt_t &which_port, const pmt::pmt_t &msg)
{
- return send(pmt_msg_accepter_ref(accepter), msg);
+ return send(pmt_msg_accepter_ref(accepter), which_port, msg);
}
} /* namespace gruel */
diff --git a/gruel/src/include/gruel/pmt.h b/gruel/src/include/gruel/pmt.h
index 1e8b38627..383a1d44d 100644
--- a/gruel/src/include/gruel/pmt.h
+++ b/gruel/src/include/gruel/pmt.h
@@ -32,6 +32,7 @@
#include <stdint.h>
#include <iosfwd>
#include <stdexcept>
+#include <vector>
namespace gruel {
class msg_accepter;
@@ -222,6 +223,12 @@ GRUEL_API bool pmt_is_complex(pmt_t obj);
//! Return a complex number constructed of the given real and imaginary parts.
GRUEL_API pmt_t pmt_make_rectangular(double re, double im);
+//! Return a complex number constructed of the given real and imaginary parts.
+GRUEL_API pmt_t pmt_from_complex(double re, double im);
+
+//! Return a complex number constructed of the given a complex number.
+GRUEL_API pmt_t pmt_from_complex(const std::complex<double> &z);
+
/*!
* If \p z is complex, real or integer, return the closest complex<double>.
* Otherwise, raise the wrong_type exception.
@@ -412,17 +419,29 @@ GRUEL_API pmt_t pmt_make_c32vector(size_t k, std::complex<float> fill);
GRUEL_API pmt_t pmt_make_c64vector(size_t k, std::complex<double> fill);
GRUEL_API pmt_t pmt_init_u8vector(size_t k, const uint8_t *data);
+GRUEL_API pmt_t pmt_init_u8vector(size_t k, const std::vector<uint8_t> &data);
GRUEL_API pmt_t pmt_init_s8vector(size_t k, const int8_t *data);
+GRUEL_API pmt_t pmt_init_s8vector(size_t k, const std::vector<int8_t> &data);
GRUEL_API pmt_t pmt_init_u16vector(size_t k, const uint16_t *data);
+GRUEL_API pmt_t pmt_init_u16vector(size_t k, const std::vector<uint16_t> &data);
GRUEL_API pmt_t pmt_init_s16vector(size_t k, const int16_t *data);
+GRUEL_API pmt_t pmt_init_s16vector(size_t k, const std::vector<int16_t> &data);
GRUEL_API pmt_t pmt_init_u32vector(size_t k, const uint32_t *data);
+GRUEL_API pmt_t pmt_init_u32vector(size_t k, const std::vector<uint32_t> &data);
GRUEL_API pmt_t pmt_init_s32vector(size_t k, const int32_t *data);
+GRUEL_API pmt_t pmt_init_s32vector(size_t k, const std::vector<int32_t> &data);
GRUEL_API pmt_t pmt_init_u64vector(size_t k, const uint64_t *data);
+GRUEL_API pmt_t pmt_init_u64vector(size_t k, const std::vector<uint64_t> &data);
GRUEL_API pmt_t pmt_init_s64vector(size_t k, const int64_t *data);
+GRUEL_API pmt_t pmt_init_s64vector(size_t k, const std::vector<int64_t> &data);
GRUEL_API pmt_t pmt_init_f32vector(size_t k, const float *data);
+GRUEL_API pmt_t pmt_init_f32vector(size_t k, const std::vector<float> &data);
GRUEL_API pmt_t pmt_init_f64vector(size_t k, const double *data);
+GRUEL_API pmt_t pmt_init_f64vector(size_t k, const std::vector<double> &data);
GRUEL_API pmt_t pmt_init_c32vector(size_t k, const std::complex<float> *data);
+GRUEL_API pmt_t pmt_init_c32vector(size_t k, const std::vector<std::complex<float> > &data);
GRUEL_API pmt_t pmt_init_c64vector(size_t k, const std::complex<double> *data);
+GRUEL_API pmt_t pmt_init_c64vector(size_t k, const std::vector<std::complex<double> > &data);
GRUEL_API uint8_t pmt_u8vector_ref(pmt_t v, size_t k);
GRUEL_API int8_t pmt_s8vector_ref(pmt_t v, size_t k);
@@ -467,6 +486,20 @@ GRUEL_API const double *pmt_f64vector_elements(pmt_t v, size_t &len); //< len
GRUEL_API const std::complex<float> *pmt_c32vector_elements(pmt_t v, size_t &len); //< len is in elements
GRUEL_API const std::complex<double> *pmt_c64vector_elements(pmt_t v, size_t &len); //< len is in elements
+// len is in elements
+GRUEL_API const std::vector<uint8_t> pmt_u8vector_elements(pmt_t v);
+GRUEL_API const std::vector<int8_t> pmt_s8vector_elements(pmt_t v);
+GRUEL_API const std::vector<uint16_t> pmt_u16vector_elements(pmt_t v);
+GRUEL_API const std::vector<int16_t> pmt_s16vector_elements(pmt_t v);
+GRUEL_API const std::vector<uint32_t> pmt_u32vector_elements(pmt_t v);
+GRUEL_API const std::vector<int32_t> pmt_s32vector_elements(pmt_t v);
+GRUEL_API const std::vector<uint64_t> pmt_u64vector_elements(pmt_t v);
+GRUEL_API const std::vector<int64_t> pmt_s64vector_elements(pmt_t v);
+GRUEL_API const std::vector<float> pmt_f32vector_elements(pmt_t v);
+GRUEL_API const std::vector<double> pmt_f64vector_elements(pmt_t v);
+GRUEL_API const std::vector<std::complex<float> > pmt_c32vector_elements(pmt_t v);
+GRUEL_API const std::vector<std::complex<double> > pmt_c64vector_elements(pmt_t v);
+
// Return non-const pointers to the elements
GRUEL_API void *pmt_uniform_vector_writable_elements(pmt_t v, size_t &len); //< works with any; len is in bytes
@@ -729,6 +762,16 @@ GRUEL_API pmt_t pmt_list6(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, con
*/
GRUEL_API pmt_t pmt_list_add(pmt_t list, const pmt_t& item);
+/*!
+ * \brief Return \p list with \p item removed from it.
+ */
+GRUEL_API pmt_t pmt_list_rm(pmt_t list, const pmt_t& item);
+
+/*!
+ * \brief Return bool of \p list contains \p item
+ */
+GRUEL_API bool pmt_list_has(pmt_t list, const pmt_t& item);
+
/*
* ------------------------------------------------------------------------
@@ -805,6 +848,15 @@ GRUEL_API std::string pmt_serialize_str(pmt_t obj);
*/
GRUEL_API pmt_t pmt_deserialize_str(std::string str);
+/*!
+ * \brief Provide a comparator function object to allow pmt use in stl types
+ */
+class pmt_comperator {
+ public:
+ bool operator()(pmt::pmt_t const& p1, pmt::pmt_t const& p2) const
+ { return pmt::pmt_eqv(p1,p2)?false:p1.get()>p2.get(); }
+ };
+
} /* namespace pmt */
#include <gruel/pmt_sugar.h>
diff --git a/gruel/src/include/gruel/pmt_sugar.h b/gruel/src/include/gruel/pmt_sugar.h
index 1d2b38ff1..bde7f716d 100644
--- a/gruel/src/include/gruel/pmt_sugar.h
+++ b/gruel/src/include/gruel/pmt_sugar.h
@@ -50,6 +50,12 @@ namespace pmt {
//! Make pmt long
static inline pmt_t
+ mp(long long unsigned x){
+ return pmt_from_long(x);
+ }
+
+ //! Make pmt long
+ static inline pmt_t
mp(int x){
return pmt_from_long(x);
}
diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc
index 1d9125d4e..1d1e9ba7c 100644
--- a/gruel/src/lib/pmt/pmt.cc
+++ b/gruel/src/lib/pmt/pmt.cc
@@ -388,9 +388,19 @@ pmt_is_complex(pmt_t x)
pmt_t
pmt_make_rectangular(double re, double im)
{
+ return pmt_from_complex(re, im);
+}
+
+pmt_t pmt_from_complex(double re, double im)
+{
return pmt_t(new pmt_complex(std::complex<double>(re, im)));
}
+pmt_t pmt_from_complex(const std::complex<double> &z)
+{
+ return pmt_t(new pmt_complex(z));
+}
+
std::complex<double>
pmt_to_complex(pmt_t x)
{
@@ -1325,6 +1335,38 @@ pmt_list_add(pmt_t list, const pmt_t& item)
}
pmt_t
+pmt_list_rm(pmt_t list, const pmt_t& item)
+{
+ if(pmt_is_pair(list)){
+ pmt_t left = pmt_car(list);
+ pmt_t right = pmt_cdr(list);
+ if(!pmt_equal(left, item)){
+ return pmt_cons(left, pmt_list_rm(right, item));
+ } else {
+ return pmt_list_rm(right, item);
+ }
+ } else {
+ return list;
+ }
+}
+
+bool
+pmt_list_has(pmt_t list, const pmt_t& item)
+{
+ if(pmt_is_pair(list)){
+ pmt_t left = pmt_car(list);
+ pmt_t right = pmt_cdr(list);
+ if(pmt_equal(left,item))
+ return true;
+ return pmt_list_has(right, item);
+ } else {
+ if(pmt_is_null(list))
+ return false;
+ throw std::runtime_error("list contains invalid format!");
+ }
+}
+
+pmt_t
pmt_caar(pmt_t pair)
{
return (pmt_car(pmt_car(pair)));
diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc
index a19809a66..24be6b772 100644
--- a/gruel/src/lib/pmt/pmt_serialize.cc
+++ b/gruel/src/lib/pmt/pmt_serialize.cc
@@ -309,11 +309,192 @@ pmt_serialize(pmt_t obj, std::streambuf &sb)
}
- if (pmt_is_vector(obj))
- throw pmt_notimplemented("pmt_serialize (vector)", obj);
+ if (pmt_is_vector(obj)) {
+ size_t vec_len = pmt::pmt_length(obj);
+ ok = serialize_untagged_u8(PST_VECTOR, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= pmt_serialize(pmt_vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if (pmt_is_uniform_vector(obj)) {
+ size_t npad = 1;
+ size_t vec_len = pmt::pmt_length(obj);
+
+ if(pmt_is_u8vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_U8, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u8(pmt_u8vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_s8vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_S8, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u8(pmt_s8vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_u16vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_U16, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u16(pmt_u16vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_s16vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_S16, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u16(pmt_s16vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
- if (pmt_is_uniform_vector(obj))
- throw pmt_notimplemented("pmt_serialize (uniform-vector)", obj);
+ if(pmt_is_u32vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_U32, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u32(pmt_u32vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_s32vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_S32, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u32(pmt_s32vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_u64vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_U64, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u64(pmt_u64vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_s64vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_S64, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_u64(pmt_s64vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_f32vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_F32, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_f64(pmt_f32vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_f64vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_F64, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ ok &= serialize_untagged_f64(pmt_f64vector_ref(obj, i), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_c32vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_C32, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ std::complex<float> c = pmt_c32vector_ref(obj, i);
+ ok &= serialize_untagged_f64(c.real(), sb);
+ ok &= serialize_untagged_f64(c.imag(), sb);
+ }
+ return ok;
+ }
+
+ if(pmt_is_c64vector(obj)) {
+ ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb);
+ ok &= serialize_untagged_u8(UVI_C64, sb);
+ ok &= serialize_untagged_u32(vec_len, sb);
+ ok &= serialize_untagged_u8(npad, sb);
+ for(size_t i=0; i<npad; i++) {
+ ok &= serialize_untagged_u8(0, sb);
+ }
+ for(size_t i=0; i<vec_len; i++) {
+ std::complex<double> c = pmt_c64vector_ref(obj, i);
+ ok &= serialize_untagged_f64(c.real(), sb);
+ ok &= serialize_untagged_f64(c.imag(), sb);
+ }
+ return ok;
+ }
+ }
if (pmt_is_dict(obj))
throw pmt_notimplemented("pmt_serialize (dict)", obj);
@@ -342,7 +523,7 @@ pmt_t
pmt_deserialize(std::streambuf &sb)
{
uint8_t tag;
- //uint8_t u8;
+ uint8_t u8;
uint16_t u16;
uint32_t u32;
uint64_t u64;
@@ -408,8 +589,159 @@ pmt_deserialize(std::streambuf &sb)
}
case PST_VECTOR:
- case PST_DICT:
+ {
+ uint32_t nitems;
+ if(!deserialize_untagged_u32(&nitems, sb))
+ goto error;
+ pmt_t vec = pmt_make_vector(nitems, PMT_NIL);
+ for(uint32_t i=0; i<nitems; i++) {
+ pmt_t item = pmt_deserialize(sb);
+ pmt_vector_set(vec, i, item);
+ }
+ return vec;
+ }
+
case PST_UNIFORM_VECTOR:
+ {
+ uint8_t utag, npad;
+ uint32_t nitems;
+
+ if(!deserialize_untagged_u8(&utag, sb))
+ return PMT_EOF;
+
+ if(!deserialize_untagged_u32(&nitems, sb))
+ goto error;
+
+ deserialize_untagged_u8(&npad, sb);
+ for(size_t i; i < npad; i++)
+ deserialize_untagged_u8(&u8, sb);
+
+ switch(utag) {
+ case(UVI_U8):
+ {
+ pmt_t vec = pmt_make_u8vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u8(&u8, sb);
+ pmt_u8vector_set(vec, i, u8);
+ }
+ return vec;
+ }
+ case(UVI_S8):
+ {
+ pmt_t vec = pmt_make_s8vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u8(&u8, sb);
+ pmt_s8vector_set(vec, i, u8);
+ }
+ return vec;
+ }
+ case(UVI_U16):
+ {
+ pmt_t vec = pmt_make_u16vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u16(&u16, sb);
+ pmt_u16vector_set(vec, i, u16);
+ }
+ return vec;
+ }
+ case(UVI_S16):
+ {
+ pmt_t vec = pmt_make_s16vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u16(&u16, sb);
+ pmt_s16vector_set(vec, i, u16);
+ }
+ return vec;
+ }
+ case(UVI_U32):
+ {
+ pmt_t vec = pmt_make_u32vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u32(&u32, sb);
+ pmt_u32vector_set(vec, i, u32);
+ }
+ return vec;
+ }
+ case(UVI_S32):
+ {
+ pmt_t vec = pmt_make_s32vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u32(&u32, sb);
+ pmt_s32vector_set(vec, i, u32);
+ }
+ return vec;
+ }
+ case(UVI_U64):
+ {
+ pmt_t vec = pmt_make_u64vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u64(&u64, sb);
+ pmt_u64vector_set(vec, i, u64);
+ }
+ return vec;
+ }
+ case(UVI_S64):
+ {
+ pmt_t vec = pmt_make_s64vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_u64(&u64, sb);
+ pmt_s64vector_set(vec, i, u64);
+ }
+ return vec;
+ }
+ case(UVI_F32):
+ {
+ pmt_t vec = pmt_make_f32vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_f64(&f64, sb);
+ pmt_f32vector_set(vec, i, static_cast<float>(f64));
+ }
+ return vec;
+ }
+ case(UVI_F64):
+ {
+ pmt_t vec = pmt_make_f64vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ deserialize_untagged_f64(&f64, sb);
+ pmt_f64vector_set(vec, i, f64);
+ }
+ return vec;
+ }
+ case(UVI_C32):
+ {
+ pmt_t vec = pmt_make_c32vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ float re, im;
+ deserialize_untagged_f64(&f64, sb);
+ re = static_cast<float>(f64);
+ deserialize_untagged_f64(&f64, sb);
+ im = static_cast<float>(f64);
+ pmt_c32vector_set(vec, i, std::complex<float>(re, im));
+ }
+ return vec;
+ }
+
+ case(UVI_C64):
+ {
+ pmt_t vec = pmt_make_c64vector(nitems, 0);
+ for(uint32_t i=0; i<nitems; i++) {
+ double re, im;
+ deserialize_untagged_f64(&f64, sb);
+ re = f64;
+ deserialize_untagged_f64(&f64, sb);
+ im = f64;
+ pmt_c64vector_set(vec, i, std::complex<double>(re, im));
+ }
+ return vec;
+ }
+
+ default:
+ throw pmt_exception("pmt_deserialize: malformed input stream, tag value = ",
+ pmt_from_long(tag));
+ }
+ }
+
+ case PST_DICT:
case PST_COMMENT:
throw pmt_notimplemented("pmt_deserialize: tag value = ",
pmt_from_long(tag));
diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc
index 6212b8ea4..3ae4d70b6 100644
--- a/gruel/src/lib/pmt/qa_pmt_prims.cc
+++ b/gruel/src/lib/pmt/qa_pmt_prims.cc
@@ -134,12 +134,24 @@ qa_pmt_prims::test_complexes()
{
pmt_t p1 = pmt_make_rectangular(2, -3);
pmt_t m1 = pmt_make_rectangular(-3, 2);
+ pmt_t p2 = pmt_from_complex(2, -3);
+ pmt_t m2 = pmt_from_complex(-3, 2);
+ pmt_t p3 = pmt_from_complex(std::complex<double>(2, -3));
+ pmt_t m3 = pmt_from_complex(std::complex<double>(-3, 2));
CPPUNIT_ASSERT(!pmt_is_complex(PMT_T));
CPPUNIT_ASSERT(pmt_is_complex(p1));
CPPUNIT_ASSERT(pmt_is_complex(m1));
+ CPPUNIT_ASSERT(pmt_is_complex(p2));
+ CPPUNIT_ASSERT(pmt_is_complex(m2));
+ CPPUNIT_ASSERT(pmt_is_complex(p3));
+ CPPUNIT_ASSERT(pmt_is_complex(m3));
CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_T), pmt_wrong_type);
CPPUNIT_ASSERT_EQUAL(std::complex<double>(2, -3), pmt_to_complex(p1));
CPPUNIT_ASSERT_EQUAL(std::complex<double>(-3, 2), pmt_to_complex(m1));
+ CPPUNIT_ASSERT_EQUAL(std::complex<double>(2, -3), pmt_to_complex(p2));
+ CPPUNIT_ASSERT_EQUAL(std::complex<double>(-3, 2), pmt_to_complex(m2));
+ CPPUNIT_ASSERT_EQUAL(std::complex<double>(2, -3), pmt_to_complex(p3));
+ CPPUNIT_ASSERT_EQUAL(std::complex<double>(-3, 2), pmt_to_complex(m3));
CPPUNIT_ASSERT_EQUAL(std::complex<double>(1.0, 0), pmt_to_complex(pmt_from_long(1)));
CPPUNIT_ASSERT_EQUAL(std::complex<double>(1.0, 0), pmt_to_complex(pmt_from_double(1.0)));
}
@@ -472,7 +484,7 @@ class qa_pmt_msg_accepter_nop : public gruel::msg_accepter {
public:
qa_pmt_msg_accepter_nop(){};
~qa_pmt_msg_accepter_nop();
- void post(pmt_t){};
+ void post(pmt_t,pmt_t){};
};
qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){}
@@ -495,9 +507,10 @@ qa_pmt_prims::test_msg_accepter()
CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0), pmt_wrong_type);
// just confirm interfaces on send are OK
- gruel::send(ma0.get(), sym);
- gruel::send(ma0, sym);
- gruel::send(p1, sym);
+ pmt_t port(pmt_intern("port"));
+ gruel::send(ma0.get(), port, sym);
+ gruel::send(ma0, port, sym);
+ gruel::send(p1, port, sym);
}
diff --git a/gruel/src/lib/pmt/unv_template.cc.t b/gruel/src/lib/pmt/unv_template.cc.t
index 566168c3d..1ed505e29 100644
--- a/gruel/src/lib/pmt/unv_template.cc.t
+++ b/gruel/src/lib/pmt/unv_template.cc.t
@@ -87,6 +87,13 @@ pmt_init_@TAG@vector(size_t k, const @TYPE@ *data)
return pmt_t(new pmt_@TAG@vector(k, data));
}
+pmt_t
+pmt_init_@TAG@vector(size_t k, const std::vector< @TYPE@ > &data)
+{
+
+ return pmt_t(new pmt_@TAG@vector(k, &data[0]));
+}
+
@TYPE@
pmt_@TAG@vector_ref(pmt_t vector, size_t k)
{
@@ -111,6 +118,18 @@ pmt_@TAG@vector_elements(pmt_t vector, size_t &len)
return _@TAG@vector(vector)->elements(len);
}
+const std::vector< @TYPE@ >
+pmt_@TAG@vector_elements(pmt_t vector)
+{
+ if (!vector->is_@TAG@vector())
+ throw pmt_wrong_type("pmt_@TAG@vector_elements", vector);
+ size_t len;
+ const @TYPE@ *array = _@TAG@vector(vector)->elements(len);
+ const std::vector< @TYPE@ > vec(array, array+len);
+ return vec;
+}
+
+
@TYPE@ *
pmt_@TAG@vector_writable_elements(pmt_t vector, size_t &len)
{
diff --git a/gruel/src/python/qa_pmt.py b/gruel/src/python/qa_pmt.py
index 1ef4fed15..59a5725fc 100755
--- a/gruel/src/python/qa_pmt.py
+++ b/gruel/src/python/qa_pmt.py
@@ -21,22 +21,82 @@
#
import unittest
-import pmt_swig
+import pmt_swig as pmt
class test_gruel_pmt(unittest.TestCase):
def test01 (self):
- a = pmt_swig.pmt_intern("a")
- b = pmt_swig.pmt_from_double(123765)
- d1 = pmt_swig.pmt_make_dict()
- d2 = pmt_swig.pmt_dict_add(d1, a, b)
- pmt_swig.pmt_print(d2)
+ a = pmt.pmt_intern("a")
+ b = pmt.pmt_from_double(123765)
+ d1 = pmt.pmt_make_dict()
+ d2 = pmt.pmt_dict_add(d1, a, b)
+ pmt.pmt_print(d2)
def test02 (self):
const = 123765
- x_pmt = pmt_swig.pmt_from_double(const)
- x_int = pmt_swig.pmt_to_double(x_pmt)
+ x_pmt = pmt.pmt_from_double(const)
+ x_int = pmt.pmt_to_double(x_pmt)
self.assertEqual(x_int, const)
+ def test03(self):
+ v = pmt.pmt_init_f32vector(3, [11, -22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test04(self):
+ v = pmt.pmt_init_f64vector(3, [11, -22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test05(self):
+ v = pmt.pmt_init_u8vector(3, [11, 22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test06(self):
+ v = pmt.pmt_init_s8vector(3, [11, -22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test07(self):
+ v = pmt.pmt_init_u16vector(3, [11, 22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test08(self):
+ v = pmt.pmt_init_s16vector(3, [11, -22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test09(self):
+ v = pmt.pmt_init_u32vector(3, [11, 22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test10(self):
+ v = pmt.pmt_init_s32vector(3, [11, -22, 33])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test11(self):
+ v = pmt.pmt_init_c32vector(3, [11 + -101j, -22 + 202j, 33 + -303j])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
+ def test12(self):
+ v = pmt.pmt_init_c64vector(3, [11 + -101j, -22 + 202j, 33 + -303j])
+ s = pmt.pmt_serialize_str(v)
+ d = pmt.pmt_deserialize_str(s)
+ self.assertTrue(pmt.pmt_equal(v, d))
+
if __name__ == '__main__':
unittest.main()
diff --git a/gruel/src/swig/CMakeLists.txt b/gruel/src/swig/CMakeLists.txt
index 332d5866f..a5e3f9399 100644
--- a/gruel/src/swig/CMakeLists.txt
+++ b/gruel/src/swig/CMakeLists.txt
@@ -24,7 +24,7 @@ include(GrPython)
include(GrSwig)
set(GR_SWIG_TARGET_DEPS pmt_generated)
-set(GR_SWIG_INCLUDE_DIRS ${GRUEL_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
+set(GR_SWIG_INCLUDE_DIRS ${GRUEL_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${Boost_INCLUDE_DIRS})
set(GR_SWIG_LIBRARIES gruel)
set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/pmt_swig_doc.i)
diff --git a/gruel/src/swig/pmt_swig.i b/gruel/src/swig/pmt_swig.i
index 45cfceadc..84f48b099 100644
--- a/gruel/src/swig/pmt_swig.i
+++ b/gruel/src/swig/pmt_swig.i
@@ -38,6 +38,27 @@
//load generated python docstrings
%include "pmt_swig_doc.i"
+%include <std_complex.i>
+%include <std_vector.i>
+%include <stl.i>
+
+namespace std {
+ %template() vector<unsigned char>;
+ %template() vector<uint8_t>;
+ %template() vector<char>;
+ %template() vector<int8_t>;
+ %template() vector<short>;
+ %template() vector<uint16_t>;
+ %template() vector<int16_t>;
+ %template() vector<int>;
+ %template() vector<int32_t>;
+ %template() vector<uint32_t>;
+ %template() vector<float>;
+ %template() vector<double>;
+ %template() vector< std::complex<float> >;
+ %template() vector< std::complex<double> >;
+};
+
////////////////////////////////////////////////////////////////////////
// Language independent exception handler
////////////////////////////////////////////////////////////////////////
@@ -191,6 +212,8 @@ bool pmt_is_complex(pmt_t obj);
//! Return a complex number constructed of the given real and imaginary parts.
pmt_t pmt_make_rectangular(double re, double im);
+pmt_t pmt_from_complex(const std::complex<double> &z);
+
/*!
* If \p z is complex, real or integer, return the closest complex<double>.
* Otherwise, raise the wrong_type exception.
@@ -380,16 +403,17 @@ pmt_t pmt_make_f64vector(size_t k, double fill);
pmt_t pmt_make_c32vector(size_t k, std::complex<float> fill);
pmt_t pmt_make_c64vector(size_t k, std::complex<double> fill);
-pmt_t pmt_init_u8vector(size_t k, const uint8_t *data);
-pmt_t pmt_init_s8vector(size_t k, const int8_t *data);
-pmt_t pmt_init_u16vector(size_t k, const uint16_t *data);
-pmt_t pmt_init_s16vector(size_t k, const int16_t *data);
-pmt_t pmt_init_u32vector(size_t k, const uint32_t *data);
-pmt_t pmt_init_s32vector(size_t k, const int32_t *data);
-pmt_t pmt_init_f32vector(size_t k, const float *data);
-pmt_t pmt_init_f64vector(size_t k, const double *data);
-pmt_t pmt_init_c32vector(size_t k, const std::complex<float> *data);
-pmt_t pmt_init_c64vector(size_t k, const std::complex<double> *data);
+
+pmt_t pmt_init_u8vector(size_t k, const std::vector<uint8_t> &data);
+pmt_t pmt_init_s8vector(size_t k, const std::vector<int8_t> &data);
+pmt_t pmt_init_u16vector(size_t k, const std::vector<uint16_t> &data);
+pmt_t pmt_init_s16vector(size_t k, const std::vector<int16_t> &data);
+pmt_t pmt_init_u32vector(size_t k, const std::vector<uint32_t> &data);
+pmt_t pmt_init_s32vector(size_t k, const std::vector<int32_t> &data);
+pmt_t pmt_init_f32vector(size_t k, const std::vector<float> &data);
+pmt_t pmt_init_f64vector(size_t k, const std::vector<double> &data);
+pmt_t pmt_init_c32vector(size_t k, const std::vector<std::complex<float> > &data);
+pmt_t pmt_init_c64vector(size_t k, const std::vector<std::complex<double> > &data);
uint8_t pmt_u8vector_ref(pmt_t v, size_t k);
int8_t pmt_s8vector_ref(pmt_t v, size_t k);
@@ -419,37 +443,23 @@ void pmt_c64vector_set(pmt_t v, size_t k, std::complex<double> x);
// Return const pointers to the elements
-const void *pmt_uniform_vector_elements(pmt_t v, size_t &len); //< works with any; len is in bytes
-
-const uint8_t *pmt_u8vector_elements(pmt_t v, size_t &len); //< len is in elements
-const int8_t *pmt_s8vector_elements(pmt_t v, size_t &len); //< len is in elements
-const uint16_t *pmt_u16vector_elements(pmt_t v, size_t &len); //< len is in elements
-const int16_t *pmt_s16vector_elements(pmt_t v, size_t &len); //< len is in elements
-const uint32_t *pmt_u32vector_elements(pmt_t v, size_t &len); //< len is in elements
-const int32_t *pmt_s32vector_elements(pmt_t v, size_t &len); //< len is in elements
-const uint64_t *pmt_u64vector_elements(pmt_t v, size_t &len); //< len is in elements
-const int64_t *pmt_s64vector_elements(pmt_t v, size_t &len); //< len is in elements
-const float *pmt_f32vector_elements(pmt_t v, size_t &len); //< len is in elements
-const double *pmt_f64vector_elements(pmt_t v, size_t &len); //< len is in elements
-const std::complex<float> *pmt_c32vector_elements(pmt_t v, size_t &len); //< len is in elements
-const std::complex<double> *pmt_c64vector_elements(pmt_t v, size_t &len); //< len is in elements
-
-// Return non-const pointers to the elements
-
-void *pmt_uniform_vector_writable_elements(pmt_t v, size_t &len); //< works with any; len is in bytes
-
-uint8_t *pmt_u8vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-int8_t *pmt_s8vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-uint16_t *pmt_u16vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-int16_t *pmt_s16vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-uint32_t *pmt_u32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-int32_t *pmt_s32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-uint64_t *pmt_u64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-int64_t *pmt_s64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-float *pmt_f32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-double *pmt_f64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-std::complex<float> *pmt_c32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
-std::complex<double> *pmt_c64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements
+%apply size_t & INOUT { size_t &len };
+
+// works with any; len is in bytes
+// Returns an opaque Python type
+const void *pmt_uniform_vector_elements(pmt_t v, size_t &len);
+
+// Returns a Python tuple
+const std::vector<uint8_t> pmt_u8vector_elements(pmt_t v);
+const std::vector<int8_t> pmt_s8vector_elements(pmt_t v);
+const std::vector<uint16_t> pmt_u16vector_elements(pmt_t v);
+const std::vector<int16_t> pmt_s16vector_elements(pmt_t v);
+const std::vector<uint32_t> pmt_u32vector_elements(pmt_t v);
+const std::vector<int32_t> pmt_s32vector_elements(pmt_t v);
+const std::vector<float> pmt_f32vector_elements(pmt_t v);
+const std::vector<double> pmt_f64vector_elements(pmt_t v);
+const std::vector<std::complex<float> > pmt_c32vector_elements(pmt_t v);
+const std::vector<std::complex<double> > pmt_c64vector_elements(pmt_t v);
/*
* ------------------------------------------------------------------------
@@ -696,6 +706,15 @@ pmt_t pmt_list6(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t&
*/
pmt_t pmt_list_add(pmt_t list, const pmt_t& item);
+/*!
+ * \brief Return \p list with \p item removed
+ */
+pmt_t pmt_list_rm(pmt_t list, const pmt_t& item);
+
+/*!
+ * \brief Return bool of \p list contains \p item
+ */
+bool pmt_list_has(pmt_t list, const pmt_t& item);
/*
* ------------------------------------------------------------------------