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 223