diff options
Diffstat (limited to 'Lib/d/carrays.i')
-rw-r--r-- | Lib/d/carrays.i | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/Lib/d/carrays.i b/Lib/d/carrays.i new file mode 100644 index 000000000..9893d09e5 --- /dev/null +++ b/Lib/d/carrays.i @@ -0,0 +1,111 @@ +/* ----------------------------------------------------------------------------- + * carrays.i + * + * D-specific version of ../carrays.i. + * ----------------------------------------------------------------------------- */ + +/* ----------------------------------------------------------------------------- + * %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) { %} +#ifdef __cplusplus +%{ return new TYPE[nelements]; %} +#else +%{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} +#endif +%{} + +static void delete_##NAME(TYPE *ary) { %} +#ifdef __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); + * ~NAME(); + * TYPE getitem(int index); + * void setitem(int index, TYPE value); + * TYPE * ptr(); + * static NAME *frompointer(TYPE *t); + * } + * + * ----------------------------------------------------------------------------- */ + +%define %array_class(TYPE,NAME) +%{ +typedef TYPE NAME; +%} + +typedef struct NAME {} NAME; + +%extend NAME { +#ifdef __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 * ptr() { + return self; + } + static NAME *frompointer(TYPE *t) { + return (NAME *) t; + } +}; + +%types(NAME = TYPE); + +%enddef |