%module(directors="1") director_ref %{ #include class Foo { public: Foo(int i = -1) : count(0) {} virtual void OnDelete() {} virtual ~Foo() {} virtual std::string Msg(std::string msg = "default") { return "Foo-" + msg; } std::string GetMsg() { return Msg(); } std::string GetMsg(std::string msg) { return Msg(msg); } void Ref() { ++count; } void Unref() { --count; if (count == 0) { OnDelete(); delete this; } } int GetRefCount() { return count; } private: int count; }; class FooPtr { public: FooPtr(Foo* f = NULL) : my_f(f) { if (my_f) { my_f->Ref(); } } ~FooPtr() { if (my_f) { my_f->Unref(); } } void Reset(Foo* f = NULL) { if (f) { f->Ref(); } if (my_f) { my_f->Unref(); } my_f = f; } int GetOwnedRefCount() { if (my_f) { return my_f->GetRefCount(); } return 0; } private: Foo* my_f; }; %} %include %feature("director") Foo; %feature("ref") Foo "$this->Ref();" %feature("unref") Foo "$this->Unref();" class Foo { public: Foo(int i = -1) : count(0) {} virtual void OnDelete() {} virtual ~Foo() {} virtual std::string Msg(std::string msg = "default") { return "Foo-" + msg; } std::string GetMsg() { return Msg(); } std::string GetMsg(std::string msg) { return Msg(msg); } void Ref() { ++count; } void Unref() { --count; if (count == 0) { OnDelete(); delete this; } } int GetRefCount() { return count; } private: int count; }; class FooPtr { public: FooPtr(Foo* f = NULL) : my_f(f) { if (my_f) { my_f->Ref(); } } ~FooPtr() { if (my_f) { my_f->Unref(); } } void Reset(Foo* f = NULL) { if (f) { f->Ref(); } if (my_f) { my_f->Unref(); } my_f = f; } int GetOwnedRefCount() { if (my_f) { return my_f->GetRefCount(); } return 0; } private: Foo* my_f; };