summaryrefslogtreecommitdiff
path: root/Examples/test-suite/li_std_vector_ptr.i
blob: dcf1128e0f69dd7f4a1348f02ce043ded07b8ca5 (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
// SF Bug 2359417
%module li_std_vector_ptr

%include "std_vector.i"

%template(IntPtrVector) std::vector<int *>;

#ifdef SWIGOCAML
%warnfilter(SWIGWARN_PARSE_KEYWORD) val;
#endif

%inline %{
#include <iostream>
using namespace std;
int* makeIntPtr(int v) {
  return new int(v);
}
std::vector<int *>::value_type makeIntPtr2(int v) {
  return new int(v);
}
int getIntValue(int *p) {
  return *p;
}
int getIntValue2(std::vector<int *>::const_reference p) {
  return *p;
}
int getIntValue3(std::vector<int *>::reference p) {
  return *p;
}

double* makeDoublePtr(double v) {
  return new double(v);
}

// pointer to pointer in the wrappers was preventing a vector of pointers from working
int** makeIntPtrPtr(int* v) {
  return new int*(v);
}

void displayVector(std::vector<int *> vpi) {
  cout << "displayVector..." << endl;
  for (size_t i=0; i<vpi.size(); ++i)
    cout << *vpi[i] << endl;
}
int getValueFromVector(std::vector<int *> vpi, size_t index) {
  return *vpi[index];
}
%}

// A not exposed to wrappers
%{
struct A {
  int val;
  A(int val) : val(val) {}
};
%}

%template(APtrVector) std::vector<A *>;

%inline %{
A *makeA(int val) { return new A(val); }
int getVal(A* a) { return a->val; }
int getVectorValueA(std::vector<A *> vpi, size_t index) {
  return vpi[index]->val;
}
%}

// B is fully exposed to wrappers
%inline %{
struct B {
  int val;
  B(int val = 0) : val(val) {}
};
%}

%template(BPtrVector) std::vector<B *>;

%inline %{
B *makeB(int val) { return new B(val); }
int getVal(B* b) { return b->val; }
int getVectorValueB(std::vector<B *> vpi, size_t index) {
  return vpi[index]->val;
}
%}

// C is fully exposed to wrappers (includes code using B **)
%inline %{
struct C {
  int val;
  C(int val = 0) : val(val) {}
};
%}

%template(CPtrVector) std::vector<C *>;

%inline %{
// pointer to pointer in the wrappers was preventing a vector of pointers from working
C** makeCIntPtrPtr(C* v) {
  return new C*(v);
}
C *makeC(int val) { return new C(val); }
int getVal(C* b) { return b->val; }
int getVectorValueC(std::vector<C *> vpi, size_t index) {
  return vpi[index]->val;
}
%}