From 12a43edc2df8853e8e0315f742e57be88f0c4269 Mon Sep 17 00:00:00 2001 From: Dave Beazley Date: Sat, 30 Nov 2002 22:01:28 +0000 Subject: The great merge git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4141 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Lib/carrays.i | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 Lib/carrays.i (limited to 'Lib/carrays.i') diff --git a/Lib/carrays.i b/Lib/carrays.i new file mode 100644 index 000000000..f5cb2e681 --- /dev/null +++ b/Lib/carrays.i @@ -0,0 +1,132 @@ +/* ----------------------------------------------------------------------------- + * carrays.i + * + * Author(s): David Beazley (beazley@cs.uchicago.edu) + * + * This library file contains macros that can be used to manipulate simple + * pointers as arrays. + * + * $Header$ + * ----------------------------------------------------------------------------- */ + +/* ----------------------------------------------------------------------------- + * %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(int nelements) { %} +#if __cplusplus +%{ return new TYPE[nelements]; %} +#else +%{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} +#endif +%{} + +static void delete_##NAME(TYPE *ary) { %} +#if __cplusplus +%{ delete [] ary; %} +#else +%{ free(ary); %} +#endif +%{} + +static TYPE NAME##_getitem(TYPE *ary, int index) { + return ary[index]; +} +static void NAME##_setitem(TYPE *ary, int index, TYPE value) { + ary[index] = value; +} +%} + +TYPE *new_##NAME(int nelements); +void delete_##NAME(TYPE *ary); +TYPE NAME##_getitem(TYPE *ary, int index); +void NAME##_setitem(TYPE *ary, int 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, TYPE value = 0); + * ~NAME(); + * TYPE getitem(int index); + * void setitem(int index, TYPE value); + * TYPE * cast(); + * static NAME *frompointer(TYPE *t); + * } + * + * ----------------------------------------------------------------------------- */ + +%define %array_class(TYPE,NAME) +%{ +typedef TYPE NAME; +%} +typedef struct NAME { + /* Put language specific enhancements here */ + +#if SWIGPYTHON + %rename(__getitem__) getitem; + %rename(__setitem__) setitem; +#endif +} NAME; + +%extend NAME { + +#if __cplusplus +NAME(int nelements) { + return new TYPE[nelements]; +} +~NAME() { + delete [] self; +} +#else +NAME(int nelements) { + return (TYPE *) calloc(nelements,sizeof(TYPE)); +} +~NAME() { + free(self); +} +#endif + +TYPE getitem(int index) { + return self[index]; +} +void setitem(int index, TYPE value) { + self[index] = value; +} +TYPE * cast() { + return self; +} +static NAME *frompointer(TYPE *t) { + return (NAME *) t; +} + +}; + +%types(NAME = TYPE); + +%enddef + + + + + + + + -- cgit v1.2.1