/* Testcase for the Java array typemaps which are not used by default. */
%module java_lib_arrays

%include "enumtypeunsafe.swg"

/* Use the Java library typemaps */
%include "arrays_java.i"

JAVA_ARRAYSOFCLASSES(SimpleStruct)
%apply ARRAYSOFENUMS[ANY] { finger[ANY] }

%include "arrays.i"

// This will test the %typemap(javacode) in the JAVA_ARRAYSOFCLASSES works with C structs amongst other things
JAVA_ARRAYSOFCLASSES(struct AnotherStruct)
%inline %{
struct AnotherStruct {
	SimpleStruct  simple;
};
double extract(struct AnotherStruct as[], int index) {
  return as[index].simple.double_field;
}
double extract2(struct AnotherStruct as[5], int index) {
  return as[index].simple.double_field;
}
%}

// Test %apply to pointers
JAVA_ARRAYSOFCLASSES(struct YetAnotherStruct)
%apply struct YetAnotherStruct[] { struct YetAnotherStruct *yas }
//%apply struct YetAnotherStruct[] { struct YetAnotherStruct * } // Note: Does not work unless this is put after the YetAnotherStruct definition
%inline %{
struct YetAnotherStruct {
	SimpleStruct  simple;
};
double extract_ptr(struct YetAnotherStruct *yas, int index) {
  return yas[index].simple.double_field;
}
void modifyYAS(struct YetAnotherStruct yas[], int size) {
  int i;
  for (i=0; i<size; ++i) {
    SimpleStruct ss;
    ss.double_field = yas[i].simple.double_field * 10.0;
    yas[i].simple = ss;
  }
}
%}

%apply ARRAYSOFENUMS[ANY] { toe[ANY] }
%apply ARRAYSOFENUMS[] { toe[] }
%apply ARRAYSOFENUMS[] { toe* }
%inline %{
typedef enum { Big, Little } toe;
void toestest(toe *t, toe tt[], toe ttt[2]) {}
%}

