summaryrefslogtreecommitdiff
path: root/Examples/test-suite/ruby_track_objects.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/ruby_track_objects.i')
-rw-r--r--Examples/test-suite/ruby_track_objects.i125
1 files changed, 125 insertions, 0 deletions
diff --git a/Examples/test-suite/ruby_track_objects.i b/Examples/test-suite/ruby_track_objects.i
new file mode 100644
index 0000000..f4bbb37
--- /dev/null
+++ b/Examples/test-suite/ruby_track_objects.i
@@ -0,0 +1,125 @@
+%module ruby_track_objects
+
+%include typemaps.i
+
+%trackobjects Foo;
+
+%newobject Bar::get_new_foo;
+
+%typemap(in, numinputs=0) Foo** foo (Foo *temp) {
+ /* %typemap(in, numinputs=0) Foo** foo */
+ $1 = &temp;
+}
+
+%typemap(argout) Foo** foo {
+ /* %typemap(argout) Foo** foo */
+ $result = SWIG_NewPointerObj((void *) *$1, $*1_descriptor, 0);
+}
+
+%apply SWIGTYPE *DISOWN {Foo* ownedFoo};
+
+
+%trackobjects ItemA;
+%trackobjects ItemB;
+
+%inline %{
+
+class Foo
+{
+public:
+ Foo() {}
+ ~Foo() {}
+
+ /* Helper method that can be called from Ruby that checks
+ that two Ruby objects are pointing to the same underlying
+ C++ object */
+ bool cpp_equal(const Foo* other)
+ {
+ return (this == other);
+ }
+
+ /* Just a simple method to call on Foo*/
+ const char* say_hello()
+ {
+ return "Hello";
+ }
+};
+
+
+class Bar
+{
+private:
+ Foo* owned_;
+ Foo* unowned_;
+public:
+ Bar(): owned_(new Foo), unowned_(0)
+ {
+ }
+
+ ~Bar()
+ {
+ delete owned_;
+ }
+
+ /* Test that track objects works with %newobject */
+ static Foo* get_new_foo()
+ {
+ return new Foo;
+ }
+
+ /* Test the same foo Ruby object is created each time */
+ Foo* get_owned_foo()
+ {
+ return owned_;
+ }
+
+ /* Test that track objects works with argout parameters.*/
+ void get_owned_foo_by_argument(Foo** foo)
+ {
+ *foo = owned_;
+ }
+
+ /* Test that track objects works with the DISOWN typemap.*/
+ void set_owned_foo(Foo* ownedFoo)
+ {
+ delete owned_;
+ owned_ = ownedFoo;
+ }
+
+ Foo* get_unowned_foo()
+ {
+ return unowned_;
+ }
+
+ void set_unowned_foo(Foo* foo)
+ {
+ unowned_ = foo;
+ }
+};
+
+class ItemA
+{
+};
+
+class ItemB: public ItemA
+{
+public:
+};
+
+ItemB* downcast(ItemA* item)
+{
+ return static_cast<ItemB*>(item);
+}
+
+class Factory
+{
+public:
+ Factory() {}
+
+ ItemA* createItem()
+ {
+ return new ItemB;
+ }
+};
+
+%}