summaryrefslogtreecommitdiff
path: root/Examples/test-suite/li_boost_shared_ptr_bits.i
blob: 2232b6cf6e3eaef52f23f903bff44b2010e6b9f1 (plain)
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_;
}
%}
////////////////////////////