1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
%module li_boost_shared_ptr_bits
#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD)
#define SHARED_PTR_WRAPPERS_IMPLEMENTED
#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_;
}
%}
////////////////////////////
|