| /* ----------------------------------------------------------------------------- | |
| * std_vector.i | |
| * | |
| * std::vector typemaps for LUA | |
| * ----------------------------------------------------------------------------- */ | |
| %{ | |
| #include <vector> | |
| %} | |
| %include <std_except.i> // the general exceptions | |
| /* | |
| A really cut down version of the vector class. | |
| Note: this does not match the true std::vector class | |
| but instead is an approximate, so that SWIG knows how to wrapper it. | |
| (Eg, all access is by value, not ref, as SWIG turns refs to pointers) | |
| And no support for iterators & insert/erase | |
| It would be useful to have a vector<->Lua table conversion routine | |
| */ | |
| namespace std { | |
| template<class T> | |
| class vector { | |
| public: | |
| typedef size_t size_type; | |
| typedef ptrdiff_t difference_type; | |
| typedef T value_type; | |
| typedef value_type* pointer; | |
| typedef const value_type* const_pointer; | |
| typedef value_type& reference; | |
| typedef const value_type& const_reference; | |
| vector(); | |
| vector(unsigned int); | |
| vector(const vector& other); | |
| vector(unsigned int,T); | |
| unsigned int size() const; | |
| unsigned int max_size() const; | |
| bool empty() const; | |
| void clear(); | |
| void push_back(T val); | |
| void pop_back(); | |
| T front()const; // only read front & back | |
| T back()const; // not write to them | |
| // operator [] given later: | |
| %extend // this is a extra bit of SWIG code | |
| { | |
| // [] is replaced by __getitem__ & __setitem__ | |
| // simply throws a string, which causes a lua error | |
| T __getitem__(unsigned int idx) throw (std::out_of_range) | |
| { | |
| if (idx>=self->size()) | |
| throw std::out_of_range("in vector::__getitem__()"); | |
| return (*self)[idx]; | |
| } | |
| void __setitem__(unsigned int idx,T val) throw (std::out_of_range) | |
| { | |
| if (idx>=self->size()) | |
| throw std::out_of_range("in vector::__setitem__()"); | |
| (*self)[idx]=val; | |
| } | |
| }; | |
| }; | |
| } | |
| /* | |
| Vector<->LuaTable fns | |
| These look a bit like the array<->LuaTable fns | |
| but are templated, not %defined | |
| (you must have template support for STL) | |
| */ | |
| /* | |
| %{ | |
| // reads a table into a vector of numbers | |
| // lua numbers will be cast into the type required (rounding may occur) | |
| // return 0 if non numbers found in the table | |
| // returns new'ed ptr if ok | |
| template<class T> | |
| std::vector<T>* SWIG_read_number_vector(lua_State* L,int index) | |
| { | |
| int i=0; | |
| std::vector<T>* vec=new std::vector<T>(); | |
| while(1) | |
| { | |
| lua_rawgeti(L,index,i+1); | |
| if (!lua_isnil(L,-1)) | |
| { | |
| lua_pop(L,1); | |
| break; // finished | |
| } | |
| if (!lua_isnumber(L,-1)) | |
| { | |
| lua_pop(L,1); | |
| delete vec; | |
| return 0; // error | |
| } | |
| vec->push_back((T)lua_tonumber(L,-1)); | |
| lua_pop(L,1); | |
| ++i; | |
| } | |
| return vec; // ok | |
| } | |
| // writes a vector of numbers out as a lua table | |
| template<class T> | |
| int SWIG_write_number_vector(lua_State* L,std::vector<T> *vec) | |
| { | |
| lua_newtable(L); | |
| for(int i=0;i<vec->size();++i) | |
| { | |
| lua_pushnumber(L,(double)((*vec)[i])); | |
| lua_rawseti(L,-2,i+1);// -1 is the number, -2 is the table | |
| } | |
| } | |
| %} | |
| // then the typemaps | |
| %define SWIG_TYPEMAP_NUM_VECTOR(T) | |
| // in | |
| %typemap(in) std::vector<T> *INPUT | |
| %{ $1 = SWIG_read_number_vector<T>(L,$input); | |
| if (!$1) SWIG_fail;%} | |
| %typemap(freearg) std::vector<T> *INPUT | |
| %{ delete $1;%} | |
| // out | |
| %typemap(argout) std::vector<T> *OUTPUT | |
| %{ SWIG_write_number_vector(L,$1); SWIG_arg++; %} | |
| %enddef | |
| */ |