diff options
author | eb | 2006-10-24 21:03:11 +0000 |
---|---|---|
committer | eb | 2006-10-24 21:03:11 +0000 |
commit | 4a03552c34d5d400afb29b8bf90b41f8c5b08464 (patch) | |
tree | c8c9ee543f24102a7a8eeba2e68dd8a586cd1a0b | |
parent | 93366b0cc2b423e47ac21b261e3944096f25b53e (diff) | |
download | gnuradio-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.cc | 14 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_feval.h | 22 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_feval.i | 14 | ||||
-rwxr-xr-x | gnuradio-core/src/python/gnuradio/gr/qa_feval.py | 18 |
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 () |