mirror of https://github.com/swig/swig
223 lines
4.4 KiB
OpenEdge ABL
223 lines
4.4 KiB
OpenEdge ABL
%module li_boost_shared_ptr_bits
|
|
|
|
#if defined(SWIGC) || 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; }
|
|
};
|
|
%}
|