| %module li_boost_shared_ptr_bits | |
| #if defined(SWIGC) || defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD) || defined(SWIGOCTAVE) || defined(SWIGRUBY) || defined(SWIGLUA) | |
| #define SHARED_PTR_WRAPPERS_IMPLEMENTED | |
| #endif | |
| #ifdef SWIGOCAML | |
| %warnfilter(SWIGWARN_PARSE_KEYWORD) val; | |
| #endif | |
| #if defined(SHARED_PTR_WRAPPERS_IMPLEMENTED) | |
| %include <boost_shared_ptr.i> | |
| %shared_ptr(NonDynamic) | |
| #endif | |
| #if defined(SWIGPYTHON) | |
| %pythonnondynamic NonDynamic; | |
| #endif | |
| %inline %{ | |
| #include <boost/shared_ptr.hpp> | |
| struct NonDynamic { | |
| int i; | |
| }; | |
| boost::shared_ptr<NonDynamic> boing(boost::shared_ptr<NonDynamic> b) { return b; } | |
| %} | |
| // vector of shared_ptr | |
| %include "std_vector.i" | |
| #if defined(SHARED_PTR_WRAPPERS_IMPLEMENTED) | |
| %shared_ptr(IntHolder); | |
| #endif | |
| %inline %{ | |
| #include "boost/shared_ptr.hpp" | |
| struct IntHolder { | |
| int val; | |
| IntHolder(int a) : val(a) {} | |
| }; | |
| int sum(std::vector< boost::shared_ptr<IntHolder> > v) { | |
| int sum = 0; | |
| for (size_t i=0; i<v.size(); ++i) | |
| sum += v[i]->val; | |
| return sum; | |
| } | |
| %} | |
| %template(VectorIntHolder) std::vector< boost::shared_ptr<IntHolder> >; | |
| ///////////////////////////////////////////////// | |
| // Test non public destructor - was leading to memory leaks as the destructor was not wrapped | |
| // Bug 3024875 | |
| ///////////////////////////////////////////////// | |
| #if defined(SHARED_PTR_WRAPPERS_IMPLEMENTED) | |
| %shared_ptr(HiddenDestructor) | |
| #endif | |
| %inline %{ | |
| class HiddenDestructor; | |
| typedef boost::shared_ptr< HiddenDestructor > FooPtr; | |
| class HiddenDestructor { | |
| public: | |
| static FooPtr create(); | |
| virtual void doit(); | |
| protected: | |
| HiddenDestructor(); | |
| static void Foo_body( FooPtr self ); | |
| virtual ~HiddenDestructor(); | |
| private: | |
| HiddenDestructor( const HiddenDestructor& ); | |
| class Impl; | |
| Impl* impl_; | |
| class FooDeleter { | |
| public: | |
| void operator()(HiddenDestructor* hidden) { | |
| delete hidden; | |
| } | |
| }; | |
| }; | |
| %} | |
| %{ | |
| #include <iostream> | |
| using namespace std; | |
| /* Impl would generally hold a weak_ptr to HiddenDestructor a.s.o, but this stripped down example should suffice */ | |
| class HiddenDestructor::Impl { | |
| public: | |
| int mymember; | |
| }; | |
| FooPtr HiddenDestructor::create() | |
| { | |
| FooPtr hidden( new HiddenDestructor(), HiddenDestructor::FooDeleter() ); | |
| Foo_body( hidden ); | |
| return hidden; | |
| } | |
| void HiddenDestructor::doit() | |
| { | |
| // whatever | |
| } | |
| HiddenDestructor::HiddenDestructor() | |
| { | |
| // cout << "HiddenDestructor::HiddenDestructor()" << endl; | |
| // always empty | |
| } | |
| void HiddenDestructor::Foo_body( FooPtr self ) | |
| { | |
| // init self as you would do in ctor | |
| self->impl_ = new Impl(); | |
| } | |
| HiddenDestructor::~HiddenDestructor() | |
| { | |
| // cout << "HiddenDestructor::~HiddenDestructor()" << endl; | |
| // destruct (e.g. delete Pimpl object) | |
| delete impl_; | |
| } | |
| %} | |
| //////////////////////////// | |
| // As above but private instead of protected destructor | |
| //////////////////////////// | |
| #if defined(SHARED_PTR_WRAPPERS_IMPLEMENTED) | |
| %shared_ptr(HiddenPrivateDestructor) | |
| #endif | |
| %inline %{ | |
| class HiddenPrivateDestructor { | |
| private: | |
| HiddenPrivateDestructor() {} | |
| virtual ~HiddenPrivateDestructor() { | |
| DeleteCount++; | |
| } | |
| class Deleter { | |
| public: | |
| void operator()(HiddenPrivateDestructor *hidden) { | |
| delete hidden; | |
| } | |
| }; | |
| public: | |
| static boost::shared_ptr<HiddenPrivateDestructor> create() { | |
| boost::shared_ptr<HiddenPrivateDestructor> hidden( new HiddenPrivateDestructor(), HiddenPrivateDestructor::Deleter() ); | |
| return hidden; | |
| } | |
| static int DeleteCount; | |
| }; | |
| int HiddenPrivateDestructor::DeleteCount = 0; | |
| %} | |
| ///////////////////////////////////////////////// | |
| // Non-public inheritance and shared_ptr | |
| ///////////////////////////////////////////////// | |
| #if defined(SHARED_PTR_WRAPPERS_IMPLEMENTED) | |
| %shared_ptr(Base) | |
| // No %shared_ptr(DerivedPrivate1) to check Warning 520 does not appear | |
| // No %shared_ptr(DerivedProtected1) to check Warning 520 does not appear | |
| %shared_ptr(DerivedPrivate2) | |
| %shared_ptr(DerivedProtected2) | |
| %ignore Base2; | |
| %shared_ptr(DerivedPublic) | |
| #endif | |
| %inline %{ | |
| class Base { | |
| public: | |
| virtual int b() = 0; | |
| virtual ~Base() {} | |
| }; | |
| class DerivedProtected1 : protected Base { | |
| public: | |
| virtual int b() { return 20; } | |
| }; | |
| class DerivedPrivate1 : private Base { | |
| public: | |
| virtual int b() { return 20; } | |
| }; | |
| class DerivedProtected2 : protected Base { | |
| public: | |
| virtual int b() { return 20; } | |
| }; | |
| class DerivedPrivate2 : private Base { | |
| public: | |
| virtual int b() { return 20; } | |
| }; | |
| class Base2 { | |
| public: | |
| virtual int b2() = 0; | |
| virtual ~Base2() {} | |
| }; | |
| class DerivedPublic : public Base2 { | |
| public: | |
| virtual int b2() { return 20; } | |
| }; | |
| %} |