#ifndef _interface_h_
#define _interface_h_ 1

typedef enum {
  GOPERATOR_OEQUAL,
  GOPERATOR_ODIFF,
  GOPERATOR_OLESS,
  GOPERATOR_OLESSEQUAL
} goperator_t;

#ifndef _interface_cpp_
typedef struct HaskellModel_ HaskellModel;

HaskellModel *gecode_model_create(void);
HaskellModel *gecode_model_copy(HaskellModel *model);
HaskellModel *gecode_model_copy_reentrant(HaskellModel *model);
void gecode_model_destroy(HaskellModel *model);
void gecode_model_propagate(HaskellModel *model);
int gecode_int_newvar(HaskellModel *model);
int gecode_int_rel(HaskellModel *model, int v1, goperator_t op, int v2);
int gecode_int_value(HaskellModel *model, int v, int val);
int gecode_int_mult(HaskellModel *model, int v1, int v2, int vr);
int gecode_int_div(HaskellModel *model, int v1, int v2, int vr);
int gecode_int_mod(HaskellModel *model, int v1, int v2, int vr);
int gecode_int_abs(HaskellModel *model, int v, int vr);
int gecode_int_dom(HaskellModel *model, int v, int low, int high);
int gecode_int_linear(HaskellModel *model, int num, int *vars, int *coef, goperator_t op, int val);
int gecode_int_alldiif(HaskellModel *model, int num, int *vars);
int gecode_int_sorted(HaskellModel *model, int num, int *vars, int strict);
void gecode_int_info(HaskellModel *model, int var, int *min, int *max, int *med, int *size, int *val);
int gecode_int_get_size(HaskellModel *model, int var);
int gecode_int_get_value(HaskellModel *model, int var);
int gecode_int_get_median(HaskellModel *model, int var);
int gecode_bool_newvar(HaskellModel *model);
#endif

#endif