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 */ 132