/* ----------------------------------------------------------------------------- * 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. * * carrays.swg * * This library file contains macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(size_t nelements) { return %new_array(nelements, TYPE); } static void delete_##NAME(TYPE *ary) { %delete_array(ary); } static TYPE NAME##_getitem(TYPE *ary, size_t index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, size_t index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(size_t nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, size_t index); void NAME##_setitem(TYPE *ary, size_t index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * Use * * %array_class_wrap(TYPE,NAME,GET,SET) * * if you want different names for the get/set methods. * ----------------------------------------------------------------------------- */ %define %array_class_wrap(TYPE,NAME,getitem,setitem) %{ typedef TYPE NAME; %} typedef struct NAME { } NAME; %extend NAME { NAME(size_t nelements) { return %new_array(nelements, TYPE); } ~NAME() { %delete_array(self); } TYPE getitem(size_t index) { return self[index]; } void setitem(size_t index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return %static_cast(t, NAME *); } }; %types(NAME = TYPE); %enddef #ifndef %array_class %define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,getitem,setitem) %enddef #endif