00001 00033 #ifndef _vector_h_ 00034 #define _vector_h_ 00035 00036 #include "bool.h" 00037 00045 typedef Bool (*LessThanOp)(void *item1, void *item2); 00046 00053 typedef void (*DestructorOp)(void *item); 00054 00061 void GenericPointerFree(void *item); 00062 00071 #define HEAP_PARENT_INDEX(i) (((i) - 1) >> 1) 00072 00081 #define HEAP_CHILD_INDEX(i) (((i) << 1) + 1) 00082 00089 struct Vector_t { 00094 LessThanOp lessOp; 00099 DestructorOp destructOp; 00105 void *array; 00111 unsigned int itemSize; 00116 unsigned int items; 00122 unsigned int size; 00127 unsigned int minSize; 00128 }; 00129 00130 typedef struct Vector_t Vector; 00131 00158 Bool VectorInit(Vector *vec, unsigned int initSize); 00159 00172 void VectorDestroy(Vector *vec); 00173 00184 Bool VectorCopy(Vector *target, Vector *source); 00185 00195 void VectorClear(Vector *vec); 00196 00207 void *VectorAdd(Vector *vec); 00208 00220 void *VectorPush(Vector *vec, void *item); 00221 00238 void *VectorHeapPush(Vector *vec, void *item); 00239 00248 void VectorPop(Vector *vec); 00249 00264 void VectorHeapPop(Vector *vec); 00265 00277 void VectorHeapSort(Vector *vec); 00278 00294 #define VectorInsert(vec, index) VectorInsertMany(vec, index, 1) 00295 00312 void *VectorInsertMany(Vector *vec, unsigned int index, unsigned int count); 00313 00323 #define VectorRemove(vec, index) VectorRemoveMany(vec, index, 1) 00324 00336 void VectorRemoveMany(Vector *vec, unsigned int index, unsigned int count); 00337 00350 void VectorMakeHeap(Vector *vec); 00351 00363 Bool VectorReserve(Vector *vec, unsigned int size); 00364 00373 #define VectorFirst(vec) (((vec)->items) ? (vec)->array : NULL) 00374 00383 #define VectorLast(vec) (((vec)->items) ? \ 00384 &(((char*)(vec)->array)[((vec)->items - 1) * (vec)->itemSize]) : \ 00385 NULL) 00386 00398 #define VectorItem(vec, index) (((unsigned)(index) < (vec)->items) ? \ 00399 &(((char*)(vec)->array)[index * (vec)->itemSize]) : NULL) 00400 00401 #endif 00402