You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.2 KiB
135 lines
3.2 KiB
5 years ago
|
/* -----------------------------------------------------------------------------
|
||
|
* See the LICENSE file for information on copyright, usage and redistribution
|
||
|
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
|
||
|
*
|
||
|
* std_vector.i
|
||
|
*
|
||
|
* std::vector typemaps for LUA
|
||
|
* ----------------------------------------------------------------------------- */
|
||
|
|
||
|
%{
|
||
|
#include <vector>
|
||
|
%}
|
||
|
%include <std_except.i> // the general exepctions
|
||
|
/*
|
||
|
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:
|
||
|
vector();
|
||
|
vector(unsigned int);
|
||
|
vector(const vector&);
|
||
|
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
|
||
|
*/
|