diff options
Diffstat (limited to 'Examples/ruby/free_function/example.i')
| -rw-r--r-- | Examples/ruby/free_function/example.i | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/Examples/ruby/free_function/example.i b/Examples/ruby/free_function/example.i new file mode 100644 index 0000000..a446b3f --- /dev/null +++ b/Examples/ruby/free_function/example.i @@ -0,0 +1,41 @@ +%module example + +%{ +#include "example.h" +%} + +/* Specify that ownership is transferred to the zoo + when calling add_animal */ +%apply SWIGTYPE *DISOWN { Animal* animal }; + +/* Track objects */ +%trackobjects; + +/* Specify the mark function */ +%freefunc Zoo "free_Zoo"; + +%include "example.h" + +%header %{ + static void free_Zoo(void* ptr) { + Zoo* zoo = (Zoo*) ptr; + + /* Loop over each object and call SWIG_RubyRemoveTracking */ + int count = zoo->get_num_animals(); + + for(int i = 0; i < count; ++i) { + /* Get an animal */ + Animal* animal = zoo->get_animal(i); + /* Unlink the Ruby object from the C++ object */ + SWIG_RubyUnlinkObjects(animal); + /* Now remove the tracking for this animal */ + SWIG_RubyRemoveTracking(animal); + } + + /* Now call SWIG_RubyRemoveTracking for the zoo */ + SWIG_RubyRemoveTracking(ptr); + + /* Now free the zoo which will free the animals it contains */ + delete zoo; + } +%} |
