#include #include #include #include #include "main.h" #include "list.h" #include "index.h" static int* index_newInt(int x) { int *new; new = malloc( sizeof(int) ); *new = x; return new; } static void printIndex(list_t *list) { int i; printf("printIndex\n"); for( i = 0 ; i < list->count ; i++ ) { int thisIndex; thisIndex = *(int *)list->list[i]; printf("%d\n", thisIndex); } } static void checkIndex(list_t *list) { int index, thisIndex; int i; if( list->count == 0 ) { printf("nothing\n"); return; } thisIndex = *(int *)list->list[0]; for( i = 1 ; i < list->count ; i++ ) { index = *(int *)list->list[i]; if( index <= thisIndex ) { printIndex(list); assert( ! "error" ); } thisIndex = index; } } list_t* newIndex() { return newList(); } int addToIndex(list_t *list, int index) { int point_index, inc_point_index; int len; int min, max; int point; len = list->count; //printf("addToIndex (%p, %d)\n", list, index); //printIndex(list); if( len == 0 ) { addList(list, index_newInt(index)); checkIndex(list); return 0; } if( len == 1 ) { point_index = *(int *)list->list[0]; if( index > point_index ) { addList(list, index_newInt(index)); checkIndex(list); return 1; } if( index < point_index ) { insList(list, 0, index_newInt(index)); checkIndex(list); return 0; } return -1; } min = 0; max = len-1; for(;;) { point = min + ( max - min ) / 2; if( max < 0 ) { insList(list, 0, index_newInt(index)); checkIndex(list); return 0; } if( point+1 >= len ) { addList(list, index_newInt(index) ); checkIndex(list); return len; } point_index = *(int *)list->list[point]; inc_point_index = *(int *)list->list[point+1]; if( point_index < index && index < inc_point_index ) { insList(list, point+1, index_newInt(index) ); checkIndex(list); return point+1; } if( index > inc_point_index ) { min = point + 1; continue; } if( index < point_index ) { max = point - 1; continue; } } } int getFormIndex(list_t *list, int index) { int point_index; int len; int min, max; int point; //printf("getFormIndex %d\n", index); //printIndex(list); len =list->count; min = 0; max = len-1; for(;;) { point = min + ( max - min ) / 2; if( max < 0 || point >= len || max < min ) { return -1; } point_index = *(int *)list->list[point]; if( point_index == index ) { return point; } if( index > point_index ) { min = point + 1; continue; } if( index < point_index ) { max = point - 1; continue; } } } void delFromIndex(list_t *list, int index) { int offset; offset = getFormIndex(list, index); assert( offset != -1 ); delListItem(list, offset, free); } void destroyIndex(list_t *list) { assert( list != NULL); destroyListItem(list, free); }