/* Array/Dictionary Package */
#ifndef MUFARRAY_H
#define MUFARRAY_H
#define ARRAY_UNDEFINED 0
#define ARRAY_PACKED 1
#define ARRAY_DICTIONARY 2
typedef struct inst array_iter;
typedef struct inst array_data;
typedef struct array_tree_t {
struct array_tree_t *left;
struct array_tree_t *right;
array_iter key;
array_data data;
short height;
} array_tree;
typedef struct stk_array_t {
int links; /* number of pointers to array */
int items; /* number of items in array */
short type; /* type of array */
short pinned; /* if pinned, don't dup array on changes */
union {
array_data *packed; /* pointer to packed array */
array_tree *dict; /* pointer to dictionary AVL tree */
} data;
} stk_array;
stk_array *new_array_dictionary(void);
stk_array *new_array_packed(int size);
void array_free(stk_array * arr);
stk_array *array_promote(stk_array * arr);
stk_array *array_decouple(stk_array * arr);
void array_set_pinned(stk_array * arr, int pinned);
int array_count(stk_array * arr);
int array_idxcmp(array_iter * a, array_iter * b);
int array_idxcmp_case(array_iter * a, array_iter * b, int case_sens);
/**/ int array_keys_homogenous(stk_array * arr);
/**/ int array_vals_homogenous(stk_array * arr);
int array_contains_key(stk_array * arr, array_iter * item);
int array_contains_value(stk_array * arr, array_data * item);
int array_first(stk_array * arr, array_iter * item);
int array_last(stk_array * arr, array_iter * item);
int array_prev(stk_array * arr, array_iter * item);
int array_next(stk_array * arr, array_iter * item);
array_data *array_getitem(stk_array * arr, array_iter * idx);
int array_setitem(stk_array ** arr, array_iter * idx, array_data * item);
int array_insertitem(stk_array ** arr, array_iter * idx, array_data * item);
int array_appenditem(stk_array ** arr, array_data * item);
stk_array *array_getrange(stk_array * arr, array_iter * start, array_iter * end);
int array_setrange(stk_array ** arr, array_iter * start, stk_array * inarr);
int array_insertrange(stk_array ** arr, array_iter * start, stk_array * inarr);
stk_array *array_demote_only(stk_array * arr, int threshold);
void array_mash(stk_array * arr_in, stk_array ** mash, int value);
int array_is_homogenous(stk_array * arr, int typ);
int array_set_strkey(stk_array ** harr, const char *key, struct inst *val);
int array_set_strkey_intval(stk_array ** arr, const char *key, int val);
int array_set_strkey_fltval(stk_array ** arr, const char *key, double val);
int array_set_strkey_refval(stk_array ** harr, const char *key, dbref val);
int array_set_strkey_strval(stk_array ** harr, const char *key, const char *val);
int array_set_strkey_arrval(stk_array ** harr, const char *key, stk_array* val);
int array_set_intkey(stk_array ** harr, int key, struct inst *val);
int array_set_intkey_intval(stk_array ** harr, int key, int val);
int array_set_intkey_fltval(stk_array ** harr, int key, double val);
int array_set_intkey_refval(stk_array ** harr, int key, dbref val);
int array_set_intkey_strval(stk_array ** harr, int key, const char *val);
int array_set_intkey_arrval(stk_array ** harr, int key, stk_array* val);
char* array_get_intkey_strval(stk_array * arr, int key);
int array_set_intval(stk_array ** harr, struct inst* key, int val);
int array_set_fltval(stk_array ** harr, struct inst* key, double val);
int array_set_refval(stk_array ** harr, struct inst* key, dbref val);
int array_set_strval(stk_array ** harr, struct inst* key, const char *val);
int array_set_arrval(stk_array ** harr, struct inst* key, stk_array* val);
#endif /* MUFARRAY_H */