summaryrefslogtreecommitdiff
path: root/Examples/octave/callback
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/octave/callback')
-rw-r--r--Examples/octave/callback/Makefile21
-rw-r--r--Examples/octave/callback/example.cxx4
-rw-r--r--Examples/octave/callback/example.h23
-rw-r--r--Examples/octave/callback/example.i13
-rw-r--r--Examples/octave/callback/runme.m63
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");
+