comparison lib/swig/swigwin-2.0.11/Lib/lua/std_vector.i @ 1899:b3009adc0e2f

Adding swig, gitignore, hgignore
author Nomad
date Mon, 21 Oct 2013 10:42:27 +0200
parents
children
comparison
equal deleted inserted replaced
1867:eb580660bbbb 1899:b3009adc0e2f
1 /* -----------------------------------------------------------------------------
2 * std_vector.i
3 *
4 * std::vector typemaps for LUA
5 * ----------------------------------------------------------------------------- */
6
7 %{
8 #include <vector>
9 %}
10 %include <std_except.i> // the general exceptions
11 /*
12 A really cut down version of the vector class.
13
14 Note: this does not match the true std::vector class
15 but instead is an approximate, so that SWIG knows how to wrapper it.
16 (Eg, all access is by value, not ref, as SWIG turns refs to pointers)
17
18 And no support for iterators & insert/erase
19
20 It would be useful to have a vector<->Lua table conversion routine
21
22 */
23 namespace std {
24
25 template<class T>
26 class vector {
27 public:
28 vector();
29 vector(unsigned int);
30 vector(const vector&);
31 vector(unsigned int,T);
32 unsigned int size() const;
33 unsigned int max_size() const;
34 bool empty() const;
35 void clear();
36 void push_back(T val);
37 void pop_back();
38 T front()const; // only read front & back
39 T back()const; // not write to them
40 // operator [] given later:
41
42 %extend // this is a extra bit of SWIG code
43 {
44 // [] is replaced by __getitem__ & __setitem__
45 // simply throws a string, which causes a lua error
46 T __getitem__(unsigned int idx) throw (std::out_of_range)
47 {
48 if (idx>=self->size())
49 throw std::out_of_range("in vector::__getitem__()");
50 return (*self)[idx];
51 }
52 void __setitem__(unsigned int idx,T val) throw (std::out_of_range)
53 {
54 if (idx>=self->size())
55 throw std::out_of_range("in vector::__setitem__()");
56 (*self)[idx]=val;
57 }
58 };
59 };
60
61 }
62
63 /*
64 Vector<->LuaTable fns
65 These look a bit like the array<->LuaTable fns
66 but are templated, not %defined
67 (you must have template support for STL)
68
69 */
70 /*
71 %{
72 // reads a table into a vector of numbers
73 // lua numbers will be cast into the type required (rounding may occur)
74 // return 0 if non numbers found in the table
75 // returns new'ed ptr if ok
76 template<class T>
77 std::vector<T>* SWIG_read_number_vector(lua_State* L,int index)
78 {
79 int i=0;
80 std::vector<T>* vec=new std::vector<T>();
81 while(1)
82 {
83 lua_rawgeti(L,index,i+1);
84 if (!lua_isnil(L,-1))
85 {
86 lua_pop(L,1);
87 break; // finished
88 }
89 if (!lua_isnumber(L,-1))
90 {
91 lua_pop(L,1);
92 delete vec;
93 return 0; // error
94 }
95 vec->push_back((T)lua_tonumber(L,-1));
96 lua_pop(L,1);
97 ++i;
98 }
99 return vec; // ok
100 }
101 // writes a vector of numbers out as a lua table
102 template<class T>
103 int SWIG_write_number_vector(lua_State* L,std::vector<T> *vec)
104 {
105 lua_newtable(L);
106 for(int i=0;i<vec->size();++i)
107 {
108 lua_pushnumber(L,(double)((*vec)[i]));
109 lua_rawseti(L,-2,i+1);// -1 is the number, -2 is the table
110 }
111 }
112 %}
113
114 // then the typemaps
115
116 %define SWIG_TYPEMAP_NUM_VECTOR(T)
117
118 // in
119 %typemap(in) std::vector<T> *INPUT
120 %{ $1 = SWIG_read_number_vector<T>(L,$input);
121 if (!$1) SWIG_fail;%}
122
123 %typemap(freearg) std::vector<T> *INPUT
124 %{ delete $1;%}
125
126 // out
127 %typemap(argout) std::vector<T> *OUTPUT
128 %{ SWIG_write_number_vector(L,$1); SWIG_arg++; %}
129
130 %enddef
131 */