Home | History | Annotate | Download | only in d
      1 /* -----------------------------------------------------------------------------
      2  * carrays.i
      3  *
      4  * D-specific version of ../carrays.i.
      5  * ----------------------------------------------------------------------------- */
      6 
      7 /* -----------------------------------------------------------------------------
      8  * %array_functions(TYPE,NAME)
      9  *
     10  * Generates functions for creating and accessing elements of a C array
     11  * (as pointers).  Creates the following functions:
     12  *
     13  *        TYPE *new_NAME(int nelements)
     14  *        void delete_NAME(TYPE *);
     15  *        TYPE NAME_getitem(TYPE *, int index);
     16  *        void NAME_setitem(TYPE *, int index, TYPE value);
     17  *
     18  * ----------------------------------------------------------------------------- */
     19 
     20 %define %array_functions(TYPE,NAME)
     21 %{
     22 static TYPE *new_##NAME(int nelements) { %}
     23 #ifdef __cplusplus
     24 %{  return new TYPE[nelements]; %}
     25 #else
     26 %{  return (TYPE *) calloc(nelements,sizeof(TYPE)); %}
     27 #endif
     28 %{}
     29 
     30 static void delete_##NAME(TYPE *ary) { %}
     31 #ifdef __cplusplus
     32 %{  delete [] ary; %}
     33 #else
     34 %{  free(ary); %}
     35 #endif
     36 %{}
     37 
     38 static TYPE NAME##_getitem(TYPE *ary, int index) {
     39     return ary[index];
     40 }
     41 static void NAME##_setitem(TYPE *ary, int index, TYPE value) {
     42     ary[index] = value;
     43 }
     44 %}
     45 
     46 TYPE *new_##NAME(int nelements);
     47 void delete_##NAME(TYPE *ary);
     48 TYPE NAME##_getitem(TYPE *ary, int index);
     49 void NAME##_setitem(TYPE *ary, int index, TYPE value);
     50 
     51 %enddef
     52 
     53 
     54 /* -----------------------------------------------------------------------------
     55  * %array_class(TYPE,NAME)
     56  *
     57  * Generates a class wrapper around a C array.  The class has the following
     58  * interface:
     59  *
     60  *          struct NAME {
     61  *              NAME(int nelements);
     62  *             ~NAME();
     63  *              TYPE getitem(int index);
     64  *              void setitem(int index, TYPE value);
     65  *              TYPE * ptr();
     66  *              static NAME *frompointer(TYPE *t);
     67   *         }
     68  *
     69  * ----------------------------------------------------------------------------- */
     70 
     71 %define %array_class(TYPE,NAME)
     72 %{
     73 typedef TYPE NAME;
     74 %}
     75 
     76 typedef struct {} NAME;
     77 
     78 %extend NAME {
     79 #ifdef __cplusplus
     80   NAME(int nelements) {
     81     return new TYPE[nelements];
     82   }
     83   ~NAME() {
     84     delete [] self;
     85   }
     86 #else
     87   NAME(int nelements) {
     88     return (TYPE *) calloc(nelements,sizeof(TYPE));
     89   }
     90   ~NAME() {
     91     free(self);
     92   }
     93 #endif
     94 
     95   TYPE getitem(int index) {
     96     return self[index];
     97   }
     98   void setitem(int index, TYPE value) {
     99     self[index] = value;
    100   }
    101   TYPE * ptr() {
    102     return self;
    103   }
    104   static NAME *frompointer(TYPE *t) {
    105     return (NAME *) t;
    106   }
    107 };
    108 
    109 %types(NAME = TYPE);
    110 
    111 %enddef
    112