1899
|
1 //
|
|
2 // std::vector
|
|
3 //
|
|
4
|
|
5 %include <std_container.i>
|
|
6
|
|
7 // Vector
|
|
8
|
|
9 %define %std_vector_methods(vector...)
|
|
10 %std_sequence_methods(vector)
|
|
11
|
|
12 void reserve(size_type n);
|
|
13 size_type capacity() const;
|
|
14 %enddef
|
|
15
|
|
16
|
|
17 %define %std_vector_methods_val(vector...)
|
|
18 %std_sequence_methods_val(vector)
|
|
19
|
|
20 void reserve(size_type n);
|
|
21 size_type capacity() const;
|
|
22 %enddef
|
|
23
|
|
24
|
|
25 // ------------------------------------------------------------------------
|
|
26 // std::vector
|
|
27 //
|
|
28 // The aim of all that follows would be to integrate std::vector with
|
|
29 // as much as possible, namely, to allow the user to pass and
|
|
30 // be returned tuples or lists.
|
|
31 // const declarations are used to guess the intent of the function being
|
|
32 // exported; therefore, the following rationale is applied:
|
|
33 //
|
|
34 // -- f(std::vector<T>), f(const std::vector<T>&):
|
|
35 // the parameter being read-only, either a sequence or a
|
|
36 // previously wrapped std::vector<T> can be passed.
|
|
37 // -- f(std::vector<T>&), f(std::vector<T>*):
|
|
38 // the parameter may be modified; therefore, only a wrapped std::vector
|
|
39 // can be passed.
|
|
40 // -- std::vector<T> f(), const std::vector<T>& f():
|
|
41 // the vector is returned by copy; therefore, a sequence of T:s
|
|
42 // is returned which is most easily used in other functions
|
|
43 // -- std::vector<T>& f(), std::vector<T>* f():
|
|
44 // the vector is returned by reference; therefore, a wrapped std::vector
|
|
45 // is returned
|
|
46 // -- const std::vector<T>* f(), f(const std::vector<T>*):
|
|
47 // for consistency, they expect and return a plain vector pointer.
|
|
48 // ------------------------------------------------------------------------
|
|
49
|
|
50 %{
|
|
51 #include <vector>
|
|
52 %}
|
|
53
|
|
54 // exported classes
|
|
55
|
|
56
|
|
57 namespace std {
|
|
58
|
|
59 template<class _Tp, class _Alloc = allocator< _Tp > >
|
|
60 class vector {
|
|
61 public:
|
|
62 typedef size_t size_type;
|
|
63 typedef ptrdiff_t difference_type;
|
|
64 typedef _Tp value_type;
|
|
65 typedef value_type* pointer;
|
|
66 typedef const value_type* const_pointer;
|
|
67 typedef _Tp& reference;
|
|
68 typedef const _Tp& const_reference;
|
|
69 typedef _Alloc allocator_type;
|
|
70
|
|
71 %traits_swigtype(_Tp);
|
|
72 %traits_enum(_Tp);
|
|
73
|
|
74 %fragment(SWIG_Traits_frag(std::vector<_Tp, _Alloc >), "header",
|
|
75 fragment=SWIG_Traits_frag(_Tp),
|
|
76 fragment="StdVectorTraits") {
|
|
77 namespace swig {
|
|
78 template <> struct traits<std::vector<_Tp, _Alloc > > {
|
|
79 typedef pointer_category category;
|
|
80 static const char* type_name() {
|
|
81 return "std::vector<" #_Tp "," #_Alloc " >";
|
|
82 }
|
|
83 };
|
|
84 }
|
|
85 }
|
|
86
|
|
87 %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<_Tp, _Alloc >);
|
|
88
|
|
89 #ifdef %swig_vector_methods
|
|
90 // Add swig/language extra methods
|
|
91 %swig_vector_methods(std::vector<_Tp, _Alloc >);
|
|
92 #endif
|
|
93
|
|
94 %std_vector_methods(vector);
|
|
95 };
|
|
96
|
|
97 // ***
|
|
98 // This specialization should disappear or get simplified when
|
|
99 // a 'const SWIGTYPE*&' can be defined
|
|
100 // ***
|
|
101 template<class _Tp, class _Alloc >
|
|
102 class vector<_Tp*, _Alloc > {
|
|
103 public:
|
|
104 typedef size_t size_type;
|
|
105 typedef ptrdiff_t difference_type;
|
|
106 typedef _Tp* value_type;
|
|
107 typedef value_type* pointer;
|
|
108 typedef const value_type* const_pointer;
|
|
109 typedef value_type reference;
|
|
110 typedef value_type const_reference;
|
|
111 typedef _Alloc allocator_type;
|
|
112
|
|
113 %traits_swigtype(_Tp);
|
|
114
|
|
115 %fragment(SWIG_Traits_frag(std::vector<_Tp*, _Alloc >), "header",
|
|
116 fragment=SWIG_Traits_frag(_Tp),
|
|
117 fragment="StdVectorTraits") {
|
|
118 namespace swig {
|
|
119 template <> struct traits<std::vector<_Tp*, _Alloc > > {
|
|
120 typedef value_category category;
|
|
121 static const char* type_name() {
|
|
122 return "std::vector<" #_Tp " *," #_Alloc " >";
|
|
123 }
|
|
124 };
|
|
125 }
|
|
126 }
|
|
127
|
|
128 %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<_Tp*, _Alloc >);
|
|
129
|
|
130 #ifdef %swig_vector_methods_val
|
|
131 // Add swig/language extra methods
|
|
132 %swig_vector_methods_val(std::vector<_Tp*, _Alloc >);
|
|
133 #endif
|
|
134
|
|
135 %std_vector_methods_val(vector);
|
|
136 };
|
|
137
|
|
138 // ***
|
|
139 // const pointer specialization
|
|
140 // ***
|
|
141 template<class _Tp, class _Alloc >
|
|
142 class vector<_Tp const *, _Alloc > {
|
|
143 public:
|
|
144 typedef size_t size_type;
|
|
145 typedef ptrdiff_t difference_type;
|
|
146 typedef _Tp const * value_type;
|
|
147 typedef value_type* pointer;
|
|
148 typedef const value_type* const_pointer;
|
|
149 typedef value_type reference;
|
|
150 typedef value_type const_reference;
|
|
151 typedef _Alloc allocator_type;
|
|
152
|
|
153 %traits_swigtype(_Tp);
|
|
154
|
|
155 %fragment(SWIG_Traits_frag(std::vector<_Tp const*, _Alloc >), "header",
|
|
156 fragment=SWIG_Traits_frag(_Tp),
|
|
157 fragment="StdVectorTraits") {
|
|
158 namespace swig {
|
|
159 template <> struct traits<std::vector<_Tp const*, _Alloc > > {
|
|
160 typedef value_category category;
|
|
161 static const char* type_name() {
|
|
162 return "std::vector<" #_Tp " const*," #_Alloc " >";
|
|
163 }
|
|
164 };
|
|
165 }
|
|
166 }
|
|
167
|
|
168 %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<_Tp const*, _Alloc >);
|
|
169
|
|
170 #ifdef %swig_vector_methods_val
|
|
171 // Add swig/language extra methods
|
|
172 %swig_vector_methods_val(std::vector<_Tp const*, _Alloc >);
|
|
173 #endif
|
|
174
|
|
175 %std_vector_methods_val(vector);
|
|
176 };
|
|
177
|
|
178 // ***
|
|
179 // bool specialization
|
|
180 // ***
|
|
181
|
|
182 template<class _Alloc >
|
|
183 class vector<bool,_Alloc > {
|
|
184 public:
|
|
185 typedef size_t size_type;
|
|
186 typedef ptrdiff_t difference_type;
|
|
187 typedef bool value_type;
|
|
188 typedef value_type* pointer;
|
|
189 typedef const value_type* const_pointer;
|
|
190 typedef value_type reference;
|
|
191 typedef value_type const_reference;
|
|
192 typedef _Alloc allocator_type;
|
|
193
|
|
194 %traits_swigtype(bool);
|
|
195
|
|
196 %fragment(SWIG_Traits_frag(std::vector<bool, _Alloc >), "header",
|
|
197 fragment=SWIG_Traits_frag(bool),
|
|
198 fragment="StdVectorTraits") {
|
|
199 namespace swig {
|
|
200 template <> struct traits<std::vector<bool, _Alloc > > {
|
|
201 typedef value_category category;
|
|
202 static const char* type_name() {
|
|
203 return "std::vector<bool, _Alloc >";
|
|
204 }
|
|
205 };
|
|
206 }
|
|
207 }
|
|
208
|
|
209 %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<bool, _Alloc >);
|
|
210
|
|
211
|
|
212 #ifdef %swig_vector_methods_val
|
|
213 // Add swig/language extra methods
|
|
214 %swig_vector_methods_val(std::vector<bool, _Alloc >);
|
|
215 #endif
|
|
216
|
|
217 %std_vector_methods_val(vector);
|
|
218
|
|
219 #if defined(SWIG_STD_MODERN_STL) && !defined(SWIG_STD_NOMODERN_STL)
|
|
220 void flip();
|
|
221 #endif
|
|
222
|
|
223 };
|
|
224
|
|
225 }
|