%define %array_class(TYPE,NAME) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "sq_item", functype="ssizeargfunc") NAME::__getitem__; %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") NAME::__setitem__; %inline %{ typedef struct { TYPE *el; } NAME; %} %extend NAME { NAME(size_t nelements) { NAME *arr = %new_instance(NAME); arr->el = %new_array(nelements, TYPE); return arr; } ~NAME() { %delete_array(self->el); %delete(self); } TYPE __getitem__(size_t index) { return self->el[index]; } void __setitem__(size_t index, TYPE value) { self->el[index] = value; } TYPE * cast() { return self->el; } static NAME *frompointer(TYPE *t) { return %reinterpret_cast(t, NAME *); } }; %types(NAME = TYPE); #else %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) #endif %enddef %include