Add pmt type that wraps a gruel::msg_accepter.
authorEric Blossom <eb@comsec.com>
Wed, 19 Aug 2009 00:39:02 +0000 (17:39 -0700)
committerEric Blossom <eb@comsec.com>
Wed, 19 Aug 2009 00:39:02 +0000 (17:39 -0700)
QA code doesn't link because pmt depends on msg and vice versa

gruel/src/include/gruel/msg_accepter.h
gruel/src/include/gruel/pmt.h
gruel/src/lib/pmt/pmt.cc
gruel/src/lib/pmt/qa_pmt_prims.cc
gruel/src/lib/pmt/qa_pmt_prims.h

index 3afd6dde08fb4616354c6af017fc8968e8246277..70ac846f53d643496319d7d8989d4c5c4870735d 100644 (file)
@@ -22,6 +22,7 @@
 #define INCLUDED_GRUEL_MSG_ACCEPTER_H
 
 #include <gruel/pmt.h>
+#include <boost/shared_ptr.hpp>
 
 namespace gruel {
 
@@ -44,6 +45,8 @@ namespace gruel {
     virtual void post(pmt::pmt_t msg) = 0;
   };
 
+  typedef boost::shared_ptr<msg_accepter> msg_accepter_sptr;
+
 } /* namespace gruel */
 
 #endif /* INCLUDED_GRUEL_MSG_ACCEPTER_H */
index 2403593017f52ea79265e6a632f935d932465a28..b1cb29f7c3ce5cfc7cf35ac6f28019ce24d4a374 100644 (file)
@@ -24,6 +24,7 @@
 #define INCLUDED_PMT_H
 
 #include <boost/intrusive_ptr.hpp>
+#include <boost/shared_ptr.hpp>
 #include <boost/any.hpp>
 #include <complex>
 #include <string>
 #include <iosfwd>
 #include <stdexcept>
 
+namespace gruel {
+  class msg_accepter;
+};
+
 /*!
  * This file defines a polymorphic type and the operations on it.
  *
@@ -482,6 +487,20 @@ boost::any pmt_any_ref(pmt_t obj);
 void pmt_any_set(pmt_t obj, const boost::any &any);
 
 
+/*
+ * ------------------------------------------------------------------------
+ *    msg_accepter -- pmt representation of gruel::msg_accepter
+ * ------------------------------------------------------------------------
+ */
+//! Return true if \p obj is a msg_accepter
+bool pmt_is_msg_accepter(const pmt_t &obj);
+
+//! make a msg_accepter
+pmt_t pmt_make_msg_accepter(boost::shared_ptr<gruel::msg_accepter> ma);
+
+//! Return underlying msg_accepter
+boost::shared_ptr<gruel::msg_accepter> pmt_msg_accepter_ref(const pmt_t &obj);
+
 /*
  * ------------------------------------------------------------------------
  *                       General functions
index f0e3c30a266f630a78252e0c4a2a35f2cfb7a918..5301529b27ef5c2ed7522c018e0c6a06edbfdb75 100644 (file)
@@ -26,8 +26,9 @@
 #include <vector>
 #include <gruel/pmt.h>
 #include "pmt_int.h"
-#include <stdio.h>
+#include <gruel/msg_accepter.h>
 #include <gruel/pmt_pool.h>
+#include <stdio.h>
 #include <string.h>
 
 namespace pmt {
@@ -881,6 +882,36 @@ pmt_any_set(pmt_t obj, const boost::any &any)
   _any(obj)->set(any);
 }
 
+////////////////////////////////////////////////////////////////////////////
+//               msg_accepter -- built from "any"
+////////////////////////////////////////////////////////////////////////////
+
+bool 
+pmt_is_msg_accepter(const pmt_t &obj)
+{
+  if (!pmt_is_any(obj))
+    return false;
+
+  boost::any r = pmt_any_ref(obj);
+  return boost::any_cast<gruel::msg_accepter_sptr>(&r) != 0;
+}
+
+//! make a msg_accepter
+pmt_t
+pmt_make_msg_accepter(gruel::msg_accepter_sptr ma)
+{
+  return pmt_make_any(ma);
+}
+
+//! Return underlying msg_accepter
+gruel::msg_accepter_sptr
+pmt_msg_accepter_ref(const pmt_t &obj)
+{
+  return boost::any_cast<gruel::msg_accepter_sptr>(pmt_any_ref(obj));
+}
+
+
+
 ////////////////////////////////////////////////////////////////////////////
 //                          General Functions
 ////////////////////////////////////////////////////////////////////////////
index 899674bbb18b4d2deaaff8cb60902c927b7a2f33..2c66b8fdb14a6ba6bdb53c02a964c2f678af170d 100644 (file)
@@ -23,6 +23,7 @@
 #include <qa_pmt_prims.h>
 #include <cppunit/TestAssert.h>
 #include <gruel/pmt.h>
+#include <gruel/msg_accepter.h>
 #include <stdio.h>
 #include <sstream>
 
@@ -453,6 +454,36 @@ qa_pmt_prims::test_any()
 
 // ------------------------------------------------------------------------
 
+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) { };
+};
+
+qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){}
+
+void
+qa_pmt_prims::test_msg_accepter()
+{
+  pmt_t sym = pmt_intern("my-symbol");
+
+  boost::any a0;
+  a0 = std::string("Hello!");
+  pmt_t p0 = pmt_make_any(a0);
+
+  gruel::msg_accepter_sptr ma0 = gruel::msg_accepter_sptr(new qa_pmt_msg_accepter_nop());
+  pmt_t p1 = pmt_make_msg_accepter(ma0);
+
+  CPPUNIT_ASSERT_EQUAL(ma0.get(), pmt_msg_accepter_ref(p1).get());
+
+  CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(sym), pmt_wrong_type);
+  CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0),  pmt_wrong_type); // FIXME
+
+}
+
+// ------------------------------------------------------------------------
+
 void
 qa_pmt_prims::test_serialize()
 {
index 2fe473c43b5c81888f7124916c7ad6adc3401c7d..fd6f70c8eab8236970e1ff6509f84a211e162cfb 100644 (file)
@@ -40,6 +40,7 @@ class qa_pmt_prims : public CppUnit::TestCase {
   CPPUNIT_TEST(test_misc);
   CPPUNIT_TEST(test_dict);
   CPPUNIT_TEST(test_any);
+  CPPUNIT_TEST(test_msg_accepter);
   CPPUNIT_TEST(test_io);
   CPPUNIT_TEST(test_lists);
   CPPUNIT_TEST(test_serialize);
@@ -59,6 +60,7 @@ class qa_pmt_prims : public CppUnit::TestCase {
   void test_misc();
   void test_dict();
   void test_any();
+  void test_msg_accepter();
   void test_io();
   void test_lists();
   void test_serialize();