Mercurial > mm7
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 */ |