diff options
Diffstat (limited to 'share/swig/2.0.11/ocaml/carray.i')
-rw-r--r-- | share/swig/2.0.11/ocaml/carray.i | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/share/swig/2.0.11/ocaml/carray.i b/share/swig/2.0.11/ocaml/carray.i new file mode 100644 index 0000000..bbf1ddd --- /dev/null +++ b/share/swig/2.0.11/ocaml/carray.i @@ -0,0 +1,136 @@ +%insert(mli) %{ +type _value = c_obj +%} + +%insert(ml) %{ +type _value = c_obj +%} + +%define %array_tmap_out(type,what,out_f) +%typemap(type) what [ANY] { + int i; + /* $*1_type */ + $result = caml_array_new($1_dim0); + for( i = 0; i < $1_dim0; i++ ) { + caml_array_set($result,i,out_f($1[i])); + } +} +%enddef + +%define %array_tmap_in(type,what,in_f) +%typemap(type) what [ANY] { + int i; + /* $*1_type */ + $1 = ($*1_type *)malloc( $1_size ); + for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { + $1[i] = in_f(caml_array_nth($input,i)); + } +} + +%typemap(free) what [ANY] { + free( (void *)$1 ); +} +%enddef + +%define %make_simple_array_typemap(type,out_f,in_f) +%array_tmap_out(out,type,out_f); +%array_tmap_out(varout,type,out_f); +%array_tmap_out(directorin,type,out_f); + +%array_tmap_in(in,type,in_f); +%array_tmap_in(varin,type,in_f); +%array_tmap_in(directorout,type,in_f); +%enddef + +%make_simple_array_typemap(bool,caml_val_bool,caml_long_val); +%make_simple_array_typemap(short,caml_val_short,caml_long_val); +%make_simple_array_typemap(unsigned short,caml_val_ushort,caml_long_val); +%make_simple_array_typemap(int,caml_val_int,caml_long_val); +%make_simple_array_typemap(unsigned int,caml_val_uint,caml_long_val); +%make_simple_array_typemap(long,caml_val_long,caml_long_val); +%make_simple_array_typemap(unsigned long,caml_val_ulong,caml_long_val); +%make_simple_array_typemap(size_t,caml_val_int,caml_long_val); +%make_simple_array_typemap(float,caml_val_float,caml_double_val); +%make_simple_array_typemap(double,caml_val_double,caml_double_val); + +#ifdef __cplusplus +%typemap(in) SWIGTYPE [] { + int i; + + /* $*1_type */ + $1 = new $*1_type [$1_dim0]; + for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { + $1[i] = *(($*1_ltype *) + caml_ptr_val(caml_array_nth($input,i), + $*1_descriptor)) ; + } +} +#else +%typemap(in) SWIGTYPE [] { + int i; + + /* $*1_type */ + $1 = ($*1_type *)malloc( $1_size ); + for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { + $1[i] = *(($*1_ltype) + caml_ptr_val(caml_array_nth($input), + $*1_descriptor)); + } +} +#endif + +%typemap(out) SWIGTYPE [] { + int i; + CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); + $result = caml_array_new($1_dim0); + + for( i = 0; i < $1_dim0; i++ ) { + if( fromval ) { + caml_array_set + ($result, + i, + callback(*fromval,caml_val_ptr((void *)&$1[i],$*1_descriptor))); + } else { + caml_array_set + ($result, + i, + caml_val_ptr ((void *)&$1[i],$&1_descriptor)); + } + } +} + +%typemap(in) enum SWIGTYPE [] { + int i; + + /* $*1_type */ + $1 = ($*1_type *)malloc( $1_size ); + for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { + $1[i] = ($type) + caml_long_val_full(caml_array_nth($input), + "$type_marker"); + } +} + +%typemap(out) enum SWIGTYPE [] { + int i; + $result = caml_array_new($1_dim0); + + for( i = 0; i < $1_dim0; i++ ) { + caml_array_set + ($result, + i, + callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"), + *caml_named_value("$type_marker"), + Val_int($1[i]))); + } +} + +#ifdef __cplusplus +%typemap(freearg) SWIGTYPE [ANY] { + delete [] $1; +} +#else +%typemap(freearg) SWIGTYPE [ANY] { + free( (void *)$1 ); +} +#endif |