PageRenderTime 33ms CodeModel.GetById 18ms app.highlight 12ms RepoModel.GetById 0ms app.codeStats 0ms

/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