%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
