1%insert(mli) %{ 2type _value = c_obj 3%} 4 5%insert(ml) %{ 6type _value = c_obj 7%} 8 9%define %array_tmap_out(type,what,out_f) 10%typemap(type) what [ANY] { 11 int i; 12 /* $*1_type */ 13 $result = caml_array_new($1_dim0); 14 for( i = 0; i < $1_dim0; i++ ) { 15 caml_array_set($result,i,out_f($1[i])); 16 } 17} 18%enddef 19 20%define %array_tmap_in(type,what,in_f) 21%typemap(type) what [ANY] { 22 int i; 23 /* $*1_type */ 24 $1 = ($*1_type *)malloc( $1_size ); 25 for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { 26 $1[i] = in_f(caml_array_nth($input,i)); 27 } 28} 29 30%typemap(free) what [ANY] { 31 free( (void *)$1 ); 32} 33%enddef 34 35%define %make_simple_array_typemap(type,out_f,in_f) 36%array_tmap_out(out,type,out_f); 37%array_tmap_out(varout,type,out_f); 38%array_tmap_out(directorin,type,out_f); 39 40%array_tmap_in(in,type,in_f); 41%array_tmap_in(varin,type,in_f); 42%array_tmap_in(directorout,type,in_f); 43%enddef 44 45%make_simple_array_typemap(bool,caml_val_bool,caml_long_val); 46%make_simple_array_typemap(short,caml_val_short,caml_long_val); 47%make_simple_array_typemap(unsigned short,caml_val_ushort,caml_long_val); 48%make_simple_array_typemap(int,caml_val_int,caml_long_val); 49%make_simple_array_typemap(unsigned int,caml_val_uint,caml_long_val); 50%make_simple_array_typemap(long,caml_val_long,caml_long_val); 51%make_simple_array_typemap(unsigned long,caml_val_ulong,caml_long_val); 52%make_simple_array_typemap(size_t,caml_val_int,caml_long_val); 53%make_simple_array_typemap(float,caml_val_float,caml_double_val); 54%make_simple_array_typemap(double,caml_val_double,caml_double_val); 55 56#ifdef __cplusplus 57%typemap(in) SWIGTYPE [] { 58 int i; 59 60 /* $*1_type */ 61 $1 = new $*1_type [$1_dim0]; 62 for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { 63 $1[i] = *(($*1_ltype *) 64 caml_ptr_val(caml_array_nth($input,i), 65 $*1_descriptor)) ; 66 } 67} 68#else 69%typemap(in) SWIGTYPE [] { 70 int i; 71 72 /* $*1_type */ 73 $1 = ($*1_type *)malloc( $1_size ); 74 for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { 75 $1[i] = *(($*1_ltype) 76 caml_ptr_val(caml_array_nth($input), 77 $*1_descriptor)); 78 } 79} 80#endif 81 82%typemap(out) SWIGTYPE [] { 83 int i; 84 CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); 85 $result = caml_array_new($1_dim0); 86 87 for( i = 0; i < $1_dim0; i++ ) { 88 if( fromval ) { 89 caml_array_set 90 ($result, 91 i, 92 callback(*fromval,caml_val_ptr((void *)&$1[i],$*1_descriptor))); 93 } else { 94 caml_array_set 95 ($result, 96 i, 97 caml_val_ptr ((void *)&$1[i],$&1_descriptor)); 98 } 99 } 100} 101 102%typemap(in) enum SWIGTYPE [] { 103 int i; 104 105 /* $*1_type */ 106 $1 = ($*1_type *)malloc( $1_size ); 107 for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { 108 $1[i] = ($type) 109 caml_long_val_full(caml_array_nth($input), 110 "$type_marker"); 111 } 112} 113 114%typemap(out) enum SWIGTYPE [] { 115 int i; 116 $result = caml_array_new($1_dim0); 117 118 for( i = 0; i < $1_dim0; i++ ) { 119 caml_array_set 120 ($result, 121 i, 122 callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"), 123 *caml_named_value("$type_marker"), 124 Val_int($1[i]))); 125 } 126} 127 128#ifdef __cplusplus 129%typemap(freearg) SWIGTYPE [ANY] { 130 delete [] $1; 131} 132#else 133%typemap(freearg) SWIGTYPE [ANY] { 134 free( (void *)$1 ); 135} 136#endif 137