#ifndef DTYPE_H #define DTYPE_H #include enum { D_SHRINK_THRESHOLD = 50, // percentage of capacity // 0 = never shrink // 100 = always shrink D_GROW_AMOUNT = 50, // percentage of size // 0 = 1 = grow by 1 on every add // 100 = double size whenever space runs out D_MAX_QUEUE_LEN = 400 // maximum num of items allowed in a fifo }; struct array_list { size_t size; size_t capacity; void **items; void (*free)(void *ptr); // free function }; struct list_fifo { struct array_list inner; size_t fifo_head; size_t *size; }; typedef struct array_list ArrayList; typedef struct list_fifo ListFiFo; /* FIFOs */ ListFiFo new_fifo(int start_size); int fifo_add(ListFiFo *l, void *i); void *fifo_get(ListFiFo *l); /* Stacks */ int arlst_push(ArrayList *l, void *item); void * arlst_pop(ArrayList *l); /* Array Lists */ // constructors ArrayList new_arlst_from_array(void *array, size_t elem_size, int length); ArrayList new_arlst_using_array_wfree(void **, int, void (*)(void *)); ArrayList new_arlst_using_array(void **array, int length); ArrayList new_arlst_wfree(int num_elems, void (*nfree)(void *ptr)); ArrayList new_arlst(int num_elems); // destructors int arlst_destroy(ArrayList *l); void * arlst_del(ArrayList *l, int id); // functions int arlst_add(ArrayList *l, void *item); void *arlst_get(ArrayList *l, int id); #endif