| %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; | |
| } | |
| }; | |
| %} |