blob: 7cf84010e3ac3bec5a6474d9adb8f9dc167ac560 [file] [log] [blame]
%module li_boost_shared_ptr_bits
#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD) || defined(SWIGOCTAVE) || defined(SWIGRUBY)
#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; }
};
%}