|
|
|
#ifndef DTYPE_H
|
|
|
|
#define DTYPE_H
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
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
|