/tags/rel-1.3.35/Lib/ocaml/std_list.i
Swig | 222 lines | 184 code | 30 blank | 8 comment | 0 complexity | a72a50ac7471458fb80a37a5601818f9 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
1/* -----------------------------------------------------------------------------
2 * See the LICENSE file for information on copyright, usage and redistribution
3 * of SWIG, and the README file for authors - http://www.swig.org/release.html.
4 *
5 * std_list.i
6 *
7 * SWIG typemaps for std::list types
8 * ----------------------------------------------------------------------------- */
9
10%include <std_common.i>
11
12%module std_list
13%{
14#include <list>
15#include <stdexcept>
16%}
17
18
19namespace std{
20 template<class T> class list
21 {
22 public:
23
24 typedef T &reference;
25 typedef const T& const_reference;
26 typedef T &iterator;
27 typedef const T& const_iterator;
28
29 list();
30 list(unsigned int size, const T& value = T());
31 list(const list<T> &);
32
33 ~list();
34 void assign(unsigned int n, const T& value);
35 void swap(list<T> &x);
36
37 const_reference front();
38 const_reference back();
39 const_iterator begin();
40 const_iterator end();
41
42 void resize(unsigned int n, T c = T());
43 bool empty() const;
44
45 void push_front(const T& x);
46 void push_back(const T& x);
47
48
49 void pop_front();
50 void pop_back();
51 void clear();
52 unsigned int size() const;
53 unsigned int max_size() const;
54 void resize(unsigned int n, const T& value);
55
56 void remove(const T& value);
57 void unique();
58 void reverse();
59 void sort();
60
61
62
63 %extend
64 {
65 const_reference __getitem__(int i) throw (std::out_of_range)
66 {
67 std::list<T>::iterator first = self->begin();
68 int size = int(self->size());
69 if (i<0) i += size;
70 if (i>=0 && i<size)
71 {
72 for (int k=0;k<i;k++)
73 {
74 first++;
75 }
76 return *first;
77 }
78 else throw std::out_of_range("list index out of range");
79 }
80 void __setitem__(int i, const T& x) throw (std::out_of_range)
81 {
82 std::list<T>::iterator first = self->begin();
83 int size = int(self->size());
84 if (i<0) i += size;
85 if (i>=0 && i<size)
86 {
87 for (int k=0;k<i;k++)
88 {
89 first++;
90 }
91 *first = x;
92 }
93 else throw std::out_of_range("list index out of range");
94 }
95 void __delitem__(int i) throw (std::out_of_range)
96 {
97 std::list<T>::iterator first = self->begin();
98 int size = int(self->size());
99 if (i<0) i += size;
100 if (i>=0 && i<size)
101 {
102 for (int k=0;k<i;k++)
103 {
104 first++;
105 }
106 self->erase(first);
107 }
108 else throw std::out_of_range("list index out of range");
109 }
110 std::list<T> __getslice__(int i,int j)
111 {
112 std::list<T>::iterator first = self->begin();
113 std::list<T>::iterator end = self->end();
114
115 int size = int(self->size());
116 if (i<0) i += size;
117 if (j<0) j += size;
118 if (i<0) i = 0;
119 if (j>size) j = size;
120 if (i>=j) i=j;
121 if (i>=0 && i<size && j>=0)
122 {
123 for (int k=0;k<i;k++)
124 {
125 first++;
126 }
127 for (int m=0;m<j;m++)
128 {
129 end++;
130 }
131 std::list<T> tmp(j-i);
132 if (j>i) std::copy(first,end,tmp.begin());
133 return tmp;
134 }
135 else throw std::out_of_range("list index out of range");
136 }
137 void __delslice__(int i,int j)
138 {
139 std::list<T>::iterator first = self->begin();
140 std::list<T>::iterator end = self->end();
141
142 int size = int(self->size());
143 if (i<0) i += size;
144 if (j<0) j += size;
145 if (i<0) i = 0;
146 if (j>size) j = size;
147
148 for (int k=0;k<i;k++)
149 {
150 first++;
151 }
152 for (int m=0;m<=j;m++)
153 {
154 end++;
155 }
156 self->erase(first,end);
157 }
158 void __setslice__(int i,int j, const std::list<T>& v)
159 {
160 std::list<T>::iterator first = self->begin();
161 std::list<T>::iterator end = self->end();
162
163 int size = int(self->size());
164 if (i<0) i += size;
165 if (j<0) j += size;
166 if (i<0) i = 0;
167 if (j>size) j = size;
168
169 for (int k=0;k<i;k++)
170 {
171 first++;
172 }
173 for (int m=0;m<=j;m++)
174 {
175 end++;
176 }
177 if (int(v.size()) == j-i)
178 {
179 std::copy(v.begin(),v.end(),first);
180 }
181 else {
182 self->erase(first,end);
183 if (i+1 <= int(self->size()))
184 {
185 first = self->begin();
186 for (int k=0;k<i;k++)
187 {
188 first++;
189 }
190 self->insert(first,v.begin(),v.end());
191 }
192 else self->insert(self->end(),v.begin(),v.end());
193 }
194
195 }
196 unsigned int __len__()
197 {
198 return self->size();
199 }
200 bool __nonzero__()
201 {
202 return !(self->empty());
203 }
204 void append(const T& x)
205 {
206 self->push_back(x);
207 }
208 void pop()
209 {
210 self->pop_back();
211 }
212
213 };
214
215 };
216}
217
218
219
220
221
222