summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreb2006-10-24 21:03:11 +0000
committereb2006-10-24 21:03:11 +0000
commit4a03552c34d5d400afb29b8bf90b41f8c5b08464 (patch)
treec8c9ee543f24102a7a8eeba2e68dd8a586cd1a0b
parent93366b0cc2b423e47ac21b261e3944096f25b53e (diff)
downloadgnuradio-4a03552c34d5d400afb29b8bf90b41f8c5b08464.tar.gz
gnuradio-4a03552c34d5d400afb29b8bf90b41f8c5b08464.tar.bz2
gnuradio-4a03552c34d5d400afb29b8bf90b41f8c5b08464.zip
added void callback to feval family
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@3847 221aa14e-8319-0410-a670-987f0aec2ac5
-rw-r--r--gnuradio-core/src/lib/general/gr_feval.cc14
-rw-r--r--gnuradio-core/src/lib/general/gr_feval.h22
-rw-r--r--gnuradio-core/src/lib/general/gr_feval.i14
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_feval.py18
4 files changed, 67 insertions, 1 deletions
diff --git a/gnuradio-core/src/lib/general/gr_feval.cc b/gnuradio-core/src/lib/general/gr_feval.cc
index 532a14018..3617620b5 100644
--- a/gnuradio-core/src/lib/general/gr_feval.cc
+++ b/gnuradio-core/src/lib/general/gr_feval.cc
@@ -50,6 +50,14 @@ gr_feval_ll::eval(long x)
return 0;
}
+gr_feval::~gr_feval(){}
+
+void
+gr_feval::eval(void)
+{
+ // nop
+}
+
/*
* Trivial examples showing C++ (transparently) calling Python
*/
@@ -70,3 +78,9 @@ gr_feval_ll_example(gr_feval_ll *f, long x)
{
return f->eval(x);
}
+
+void
+gr_feval_example(gr_feval *f)
+{
+ f->eval();
+}
diff --git a/gnuradio-core/src/lib/general/gr_feval.h b/gnuradio-core/src/lib/general/gr_feval.h
index 18bb4007e..a2f7020a4 100644
--- a/gnuradio-core/src/lib/general/gr_feval.h
+++ b/gnuradio-core/src/lib/general/gr_feval.h
@@ -85,11 +85,31 @@ public:
};
/*!
+ * \brief base class for evaluating a function: void -> void
+ *
+ * This class is designed to be subclassed in Python or C++
+ * and is callable from both places. It uses SWIG's
+ * "director" feature to implement the magic.
+ * It's slow. Don't use it in a performance critical path.
+ */
+class gr_feval
+{
+public:
+ gr_feval() {}
+ virtual ~gr_feval();
+
+ /*!
+ * \brief override this to define the function
+ */
+ virtual void eval();
+};
+
+/*!
* \brief trivial examples / test cases showing C++ calling Python code
*/
double gr_feval_dd_example(gr_feval_dd *f, double x);
gr_complex gr_feval_cc_example(gr_feval_cc *f, gr_complex x);
long gr_feval_ll_example(gr_feval_ll *f, long x);
-
+void gr_feval_example(gr_feval *f);
#endif /* INCLUDED_GR_FEVAL_H */
diff --git a/gnuradio-core/src/lib/general/gr_feval.i b/gnuradio-core/src/lib/general/gr_feval.i
index 586e143d0..09d98b648 100644
--- a/gnuradio-core/src/lib/general/gr_feval.i
+++ b/gnuradio-core/src/lib/general/gr_feval.i
@@ -24,6 +24,7 @@
%feature("director") gr_feval_dd;
%feature("director") gr_feval_cc;
%feature("director") gr_feval_ll;
+%feature("director") gr_feval;
%rename(feval_dd) gr_feval_dd;
@@ -56,6 +57,16 @@ public:
virtual long eval(long x);
};
+%rename(feval) gr_feval;
+class gr_feval
+{
+public:
+ gr_feval() {}
+ virtual ~gr_feval();
+
+ virtual void eval();
+};
+
// examples / test cases
@@ -67,3 +78,6 @@ gr_complex gr_feval_cc_example(gr_feval_cc *f, gr_complex x);
%rename(feval_ll_example) gr_feval_ll_example;
long gr_feval_ll_example(gr_feval_ll *f, long x);
+
+%rename(feval_example) gr_feval_example;
+void gr_feval_example(gr_feval *f);
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_feval.py b/gnuradio-core/src/python/gnuradio/gr/qa_feval.py
index 7afc5ec0e..f630e09aa 100755
--- a/gnuradio-core/src/python/gnuradio/gr/qa_feval.py
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_feval.py
@@ -34,6 +34,12 @@ class my_add2_cc(gr.feval_cc):
def eval(self, x):
return x + (2 - 2j)
+class my_feval(gr.feval):
+ def __init__(self):
+ gr.feval.__init__(self)
+ self.fired = False
+ def eval(self):
+ self.fired = True
class test_feval(gr_unittest.TestCase):
@@ -87,6 +93,18 @@ class test_feval(gr_unittest.TestCase):
actual_result = tuple([gr.feval_cc_example(f, x) for x in src_data])
self.assertEqual(expected_result, actual_result)
+ def test_void_1(self):
+ # this is all in python
+ f = my_feval()
+ f.eval()
+ self.assertEqual(True, f.fired)
+
+ def test_void_2(self):
+ # this is python -> C++ -> python and back again
+ f = my_feval()
+ gr.feval_example(f)
+ self.assertEqual(True, f.fired)
+
if __name__ == '__main__':
gr_unittest.main ()