/*
This test case tests that various types of arrays are working.
*/

%module arrays
%{
#include <stdlib.h>
%}

%inline %{
#define ARRAY_LEN 2

typedef enum {One, Two, Three, Four, Five} finger;

typedef struct {
	double         double_field;
} SimpleStruct;

typedef struct {
	char           array_c [ARRAY_LEN];
	signed char    array_sc[ARRAY_LEN];
	unsigned char  array_uc[ARRAY_LEN];
	short          array_s [ARRAY_LEN];
	unsigned short array_us[ARRAY_LEN];
	int            array_i [ARRAY_LEN];
	unsigned int   array_ui[ARRAY_LEN];
	long           array_l [ARRAY_LEN];
	unsigned long  array_ul[ARRAY_LEN];
	long long      array_ll[ARRAY_LEN];
	float          array_f [ARRAY_LEN];
        double         array_d [ARRAY_LEN];
        SimpleStruct   array_struct[ARRAY_LEN];
        SimpleStruct*  array_structpointers[ARRAY_LEN];
        int*           array_ipointers [ARRAY_LEN];
	finger         array_enum[ARRAY_LEN];
	finger*        array_enumpointers[ARRAY_LEN];
	const int      array_const_i[ARRAY_LEN];
} ArrayStruct;

void fn_taking_arrays(SimpleStruct array_struct[ARRAY_LEN]) {}

/* Pointer helper functions used in the Java run test */
int* newintpointer() {
    return (int*)malloc(sizeof(int));
}
void setintfrompointer(int* intptr, int value) {
    *intptr = value;
}
int getintfrompointer(int* intptr) {
    return *intptr;
}

%}

// This tests wrapping of function that involves pointer to array


%inline %{
void array_pointer_func(int (*x)[10]) {}
%}


%inline %{
typedef float FLOAT;

typedef FLOAT cartPosition_t[3]; 

typedef struct {
cartPosition_t p;
} CartPoseData_t;

%}
