diff options
Diffstat (limited to 'Examples/octave/callback')
| -rw-r--r-- | Examples/octave/callback/Makefile | 21 | ||||
| -rw-r--r-- | Examples/octave/callback/example.cxx | 4 | ||||
| -rw-r--r-- | Examples/octave/callback/example.h | 23 | ||||
| -rw-r--r-- | Examples/octave/callback/example.i | 13 | ||||
| -rw-r--r-- | Examples/octave/callback/runme.m | 63 |
5 files changed, 124 insertions, 0 deletions
diff --git a/Examples/octave/callback/Makefile b/Examples/octave/callback/Makefile new file mode 100644 index 0000000..2bce9df --- /dev/null +++ b/Examples/octave/callback/Makefile @@ -0,0 +1,21 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +LIBS = -lm +SWIGOPT = + +all:: + $(MAKE) -f $(TOP)/Makefile $(SWIGLIB) CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' octave_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile $(SWIGLIB) CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='myoctave' INTERFACE='$(INTERFACE)' octave_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile octave_clean + rm -f $(TARGET).py + +check: all diff --git a/Examples/octave/callback/example.cxx b/Examples/octave/callback/example.cxx new file mode 100644 index 0000000..450d756 --- /dev/null +++ b/Examples/octave/callback/example.cxx @@ -0,0 +1,4 @@ +/* File : example.cxx */ + +#include "example.h" + diff --git a/Examples/octave/callback/example.h b/Examples/octave/callback/example.h new file mode 100644 index 0000000..1a0e8c4 --- /dev/null +++ b/Examples/octave/callback/example.h @@ -0,0 +1,23 @@ +/* File : example.h */ + +#include <cstdio> +#include <iostream> + +class Callback { +public: + virtual ~Callback() { std::cout << "Callback::~Callback()" << std:: endl; } + virtual void run() { std::cout << "Callback::run()" << std::endl; } +}; + + +class Caller { +private: + Callback *_callback; +public: + Caller(): _callback(0) {} + ~Caller() { delCallback(); } + void delCallback() { delete _callback; _callback = 0; } + void setCallback(Callback *cb) { delCallback(); _callback = cb; } + void call() { if (_callback) _callback->run(); } +}; + diff --git a/Examples/octave/callback/example.i b/Examples/octave/callback/example.i new file mode 100644 index 0000000..90beda0 --- /dev/null +++ b/Examples/octave/callback/example.i @@ -0,0 +1,13 @@ +/* File : example.i */ +%module(directors="1") example +%{ +#include "example.h" +%} + +%include "std_string.i" + +/* turn on director wrapping Callback */ +%feature("director") Callback; + +%include "example.h" + diff --git a/Examples/octave/callback/runme.m b/Examples/octave/callback/runme.m new file mode 100644 index 0000000..b87925e --- /dev/null +++ b/Examples/octave/callback/runme.m @@ -0,0 +1,63 @@ +# file: runme.m + +# This file illustrates the cross language polymorphism using directors. + +example + +OctCallback=@() subclass(example.Callback(), \ + 'run',@(self) printf("OctCallback.run()\n")); + +# Create an Caller instance + +caller = example.Caller(); + +# Add a simple C++ callback (caller owns the callback, so +# we disown it first) + +printf("Adding and calling a normal C++ callback\n"); +printf("----------------------------------------\n"); + +callback = example.Callback().__disown(); +caller.setCallback(callback); +caller.call(); +caller.delCallback(); + +printf("Adding and calling a Octave callback\n"); +printf("------------------------------------\n"); + +# Add a Octave callback (caller owns the callback, so we +# disown it first by calling __disown). + +caller.setCallback(OctCallback().__disown()) +caller.call(); +caller.delCallback(); + +printf("Adding and calling another Octave callback\n"); +printf("------------------------------------------\n"); + +# Let's do the same but use the weak reference this time. + +callback = OctCallback().__disown(); +caller.setCallback(callback); +caller.call(); +caller.delCallback(); + +# careful-- using callback here may cause problems; octave_swig_type still +# exists, but is holding a destroyed object (the C++ example.Callback). +# to manually drop the octave-side reference, you can use +clear callback; + +# Let's call them directly now + +printf("Calling Octave and C++ callbacks directly\n"); +printf("------------------------------------------\n"); + +a = OctCallback(); +a.run(); +a.Callback.run(); + + +# All done. + +printf("octave exit\n"); + |
