X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=tests%2Fvectortests.c;h=f85f7ccf8dd7940e25180f686ecc0f07bfc70796;hb=183905767f8b512dd030c3432595fc6d2c702a41;hp=30169dc26e59d272382de61101fbb13dfa3ef76b;hpb=a0be49ff8fda77c328424c09d6d0ad4a9f7e8f66;p=rrq%2Frrqmisc.git diff --git a/tests/vectortests.c b/tests/vectortests.c index 30169dc..f85f7cc 100644 --- a/tests/vectortests.c +++ b/tests/vectortests.c @@ -6,7 +6,12 @@ #include #include -#define OUT(...) fprintf( stderr, __VA_ARGS__ ) +static int LINE; + +#define max(a,b) ((a>b)?a:b) +#define OUT(...) { \ + fprintf( stderr, __VA_ARGS__ ); \ +} // dump an item; return 0 to stop static void itemdump(const vector_index index,const void *slot) { @@ -57,151 +62,176 @@ static void my_vector_dump( vector_dump( vp, itemdump ); } +static char *item25 = "this is first item"; +static char *item75 = "this is second item"; + int main(int argc,char **argv) { - OUT( "VECTOR_LEVEL_BITS = %d\n", VECTOR_LEVEL_BITS ); - OUT( "sizeof( vector_index ) = %ld\n", sizeof( vector_index ) ); - OUT( "VECTOR_INDEX_BITS - %ld\n", VECTOR_INDEX_BITS ); - OUT( "VECTOR_INDEX_FIELDS = %ld\n", VECTOR_INDEX_FIELDS ); - OUT( "VECTOR_SLOTS = %d\n", VECTOR_SLOTS ); - OUT( "sizeof( vector_page ) = %ld\n", sizeof( vector_page ) ); - OUT( "sizeof( vector ) = %ld\n", sizeof( vector ) ); - - vector v = { 100, 0 }; // Create an empty vector of 100 slots. - void ** slot; - void *item; - int i; + int variant = 0; + for ( ; variant < 4; variant++ ) { + OUT( "variant = %d ========================\n", variant ); + vector v = { variant, 100, 0 }; // Create an empty vector of 100 slots. + + //OUT( "VECTOR_LEVEL_BITS = %d\n", VECTOR_LEVEL_BITS ); + //OUT( "sizeof( vector_index ) = %ld\n", sizeof( vector_index ) ); + //OUT( "VECTOR_INDEX_BITS - %ld\n", VECTOR_INDEX_BITS ); + //OUT( "VECTOR_INDEX_FIELDS = %ld\n", VECTOR_INDEX_FIELDS ); + OUT( "VECTOR_SLOTS = %ld\n", VECTOR_SLOTS( &v ) ); + // OUT( "sizeof( vector_page ) = %ld\n", sizeof( vector_page ) ); + OUT( "sizeof( vector ) = %ld\n", sizeof( vector ) ); + + void ** slot; + void *item; + int i; - OUT( "vector v has 100 empty slots\n" ); - - // void vector_dump(vector *pv, - // int (*itemdump)(const vector_index ,const void *)); - // void **vector_next_used(vector *pv,vector_index *index); - my_vector_dump( &v, itemdump ); - - //void vector_set(vector *pv,vector_index index,void *value); - vector_set( &v, 25, "this is first item" ); - - // void **vector_prev_used(vector *pv,vector_index *index); - int t0[6] = { 0, 25, 50, 99, 100, 1000 }; - OUT( "vector_next_used:\n" ); - for ( i = 0; i < 6; i++ ) { - vector_index index = t0[i]; - slot = vector_next_used( &v, &index ); - OUT( " [%d] => [%ld] %p\n", t0[i], index, slot ); - } - - OUT( "vector_prev_used:\n" ); - for ( i = 0; i < 6; i++ ) { - vector_index index = t0[i]; - slot = vector_prev_used( &v, &index ); - OUT( " [%d] => [%ld] %p\n", t0[i], index, slot ); - } - - vector_set( &v, 75, "this is second item" ); - OUT( "vector v has 2 non-empty slots\n" ); - my_vector_dump( &v, itemdump ); + OUT( "vector v has 100 empty slots\n" ); + + // void vector_dump(vector *pv, + // int (*itemdump)(const vector_index ,const void *)); + // void **vector_next_used(vector *pv,vector_index *index); + my_vector_dump( &v, itemdump ); + + //void vector_set(vector *pv,vector_index index,void *value); + item = item25; + vector_set( &v, 25, item ); + OUT( "assigned 25 to %p %s\n", item, (char*)item ); + + // void **vector_prev_used(vector *pv,vector_index *index); + int t0[6] = { 0, 25, 50, 99, 100, 1000 }; + OUT( "vector_next_used:\n" ); + for ( i = 0; i < 6; i++ ) { + vector_index index = t0[i]; + slot = vector_next_used( &v, &index ); + OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 ); + } + + OUT( "vector_prev_used:\n" ); + for ( i = 0; i < 6; i++ ) { + vector_index index = t0[i]; + slot = vector_prev_used( &v, &index ); + OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 ); + } + + item = item75; + vector_set( &v, 75, item ); + OUT( "assigned 75 to %p %s\n", item, (char*)item ); + + my_vector_dump( &v, itemdump ); - OUT( "vector_next_used:\n" ); - for ( i = 0; i < 6; i++ ) { - vector_index index = t0[i]; - slot = vector_next_used( &v, &index ); - OUT( " [%d] => [%ld] %p\n", t0[i], index, slot ); - } - - OUT( "vector_prev_used:\n" ); - for ( i = 0; i < 6; i++ ) { - vector_index index = t0[i]; - slot = vector_prev_used( &v, &index ); - OUT( " [%d] => [%ld] %p\n", t0[i], index, slot ); - } - - OUT( "shrinking the vector:\n" ); - // int vector_resize( - // vector *pv, vector_index new_size, - // int (*reclaim)(vector *pv,vector_index index,void *item,void *data), - // void *data ); - i = vector_resize( &v, 50, itemreclaim, (void*)1 ); - OUT( "shrink to 50 (reclaim refused) = %d\n", i ); + OUT( "vector_next_used:\n" ); + for ( i = 0; i < 6; i++ ) { + vector_index index = t0[i]; + slot = vector_next_used( &v, &index ); + OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 ); + } + + OUT( "vector_prev_used:\n" ); + for ( i = 0; i < 6; i++ ) { + vector_index index = t0[i]; + slot = vector_prev_used( &v, &index ); + OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 ); + } + + OUT( "shrinking the vector:\n" ); + // int vector_resize( + // vector *pv, vector_index new_size, + // int (*reclaim)(vector *pv,vector_index index, + // void *item, void *data), + // void *data ); + i = vector_resize( &v, 50, itemreclaim, (void*)1 ); + OUT( "shrink to 50 (reclaim refused) = %d\n", i ); - i = vector_resize( &v, 50, itemreclaim, (void*)0 ); - OUT( "shrink to 50 (accept reclaim) = %d\n", i ); + i = vector_resize( &v, 50, itemreclaim, (void*)0 ); + OUT( "shrink to 50 (accept reclaim) = %d\n", i ); - i = vector_resize( &v, 508, 0, 0 ); - OUT( "grow to 508 (no reclaim) = %d\n", i ); + i = vector_resize( &v, 508, 0, 0 ); + OUT( "grow to 508 (no reclaim) = %d\n", i ); - // void **vector_entry(vector *pv,vector_index index); + // void **vector_entry(vector *pv,vector_index index); #define SLOTSTR(slot) (slot? ((*slot)? *slot : "(nil)") : "(unassigned)" ) - slot = vector_entry( &v, 24 ); - itemdump( 24, SLOTSTR(slot) ); - - slot = vector_entry( &v, 25 ); - itemdump( 25, SLOTSTR(slot) ); - - slot = vector_entry( &v, 300 ); - itemdump( 300, SLOTSTR( slot ) ); - - //#define vector_size(pv) ((vector_index) (pv)->size) - OUT( "vector size: %ld\n", vector_size( &v ) ); - - // void *vector_get_set(vector *pv,vector_index index,void *value); - item = vector_get_set( &v, 25, "another value" ); - // void *vector_get(vector *pv,vector_index index); - OUT( "old: \"%s\", new: \"%s\"\n", - (char*)item, (char*)vector_get( &v, 25 ) ); - - // void vector_append(vector *pv,void *value); - vector_append( &v, "the very last item" ); - OUT( "vector size: %ld\n", vector_size( &v ) ); - my_vector_dump( &v, itemdump ); - - vector v2 = { 200, 0 }; - // void vector_copy( - // vector *dst,vector_index di, - // vector *src,vector_index si, - // vector_index n); - vector_copy( &v2, 20, &v, 10, 20 ); - my_vector_dump( &v2, itemdump ); - - vector_resize( &v2, 0, itemreclaim, 0 ); // Reset vector v2 - my_vector_dump( &v2, itemdump ); - - vector_append( &v2, "9 the very last item" ); - vector_append( &v2, "3 the very last item" ); - vector_append( &v2, "4 the very last item" ); - vector_append( &v2, "6 the very last item" ); - vector_append( &v2, "5 the very last item" ); - vector_resize( &v2, vector_size( &v2 ) + 3, 0, 0 ); - vector_append( &v2, "2 the very last item" ); - vector_append( &v2, "8 the very last item" ); - vector_append( &v2, "1 the very last item" ); - vector_append( &v2, 0 ); - vector_append( &v2, "7 the very last item" ); - vector_append( &v2, "0 the very last item" ); - my_vector_dump( &v2, itemdump ); - - // void vector_qsort(vector *pv,int (*compar)(const void *,const void *)); - OUT( "sorted:" ); - vector_qsort( &v2, itemcmp ); - my_vector_dump( &v2, itemdump ); - - // void vector_iterate(vector *pv, - // vector_index start, - // int (*itemfn)(vector_index,void *item,void *data), - // void *data); - OUT( "showing all slots\n" ); - vector_iterate( &v2, 4, itemiter, 0 ); - - // void *vector_bsearch(vector *pv,vector_index *index,const void *key, - // int (*compare)(const void *key, const void *item)); - char *pfx[5] = { "4", "9", "0", "3", "10" }; - for ( i = 0; i < ( sizeof( pfx ) / sizeof( char* ) ); i++ ) { - char *prefix = pfx[i]; - vector_index index = 0; - OUT( "lookup prefix \"%s\":\n", prefix ); - item = vector_bsearch( &v2, &index, prefix, itemfind ); - OUT( "[%ld] %p %s\n", index, item, ( item? (char*)item : "(null)" ) ); + slot = vector_entry( &v, 24 ); + itemdump( 24, SLOTSTR(slot) ); + + slot = vector_entry( &v, 25 ); + itemdump( 25, SLOTSTR(slot) ); + + slot = vector_entry( &v, 300 ); + itemdump( 300, SLOTSTR( slot ) ); + + //#define vector_size(pv) ((vector_index) (pv)->size) + OUT( "vector size: %ld\n", vector_size( &v ) ); + + // void *vector_get(vector *pv,vector_index index); + // void *vector_get_set(vector *pv,vector_index index,void *value); + item = vector_get( &v, 25 ); + OUT( "old item 25 is %p %s\n", item, (char*)item ); + item = "another value"; + OUT( "new item 25 is %p %s\n", item, (char*)item ); + item = vector_get_set( &v, 25, item ); + OUT( "got item 25 as %p %s\n", item, (char*)item ); + item = vector_get( &v, 25 ); + OUT( "now item 25 is %p %s\n", item, (char*)item ); + + // void vector_append(vector *pv,void *value); + item = "the very last item"; + OUT( "appending %p %s\n", item, (char*)item ); + vector_append( &v, item ); + + OUT( "vector size: %ld\n", vector_size( &v ) ); + my_vector_dump( &v, itemdump ); + + vector v2 = { variant, 200, 0 }; + // void vector_copy( + // vector *dst,vector_index di, + // vector *src,vector_index si, + // vector_index n); + vector_copy( &v2, 20, &v, 10, 20 ); + my_vector_dump( &v2, itemdump ); + + vector_resize( &v2, 0, itemreclaim, 0 ); // Reset vector v2 + my_vector_dump( &v2, itemdump ); + + vector_append( &v2, "9 the very last item" ); + vector_append( &v2, "3 the very last item" ); + vector_append( &v2, "4 the very last item" ); + vector_append( &v2, "6 the very last item" ); + vector_append( &v2, "5 the very last item" ); + vector_resize( &v2, vector_size( &v2 ) + 3, 0, 0 ); + vector_append( &v2, "2 the very last item" ); + vector_append( &v2, "8 the very last item" ); + vector_append( &v2, "1 the very last item" ); + vector_append( &v2, 0 ); + vector_append( &v2, "7 the very last item" ); + vector_append( &v2, "0 the very last item" ); + my_vector_dump( &v2, itemdump ); + + // void vector_qsort(vector*,int (*compar)(const void *,const void *)); + OUT( "sorted:" ); + vector_qsort( &v2, itemcmp ); + my_vector_dump( &v2, itemdump ); + + // void vector_iterate(vector *pv, + // vector_index start, + // int (*itemfn)(vector_index,void *item,void *data), + // void *data); + OUT( "showing all slots\n" ); + vector_iterate( &v2, 4, itemiter, 0 ); + + // void *vector_bsearch(vector *pv,vector_index *index,const void *key, + // int (*compare)(const void *key, const void *item)); + char *pfx[5] = { "4", "9", "0", "3", "10" }; + for ( i = 0; i < ( sizeof( pfx ) / sizeof( char* ) ); i++ ) { + char *prefix = pfx[i]; + vector_index index = 0; + OUT( "lookup prefix \"%s\":\n", prefix ); + item = vector_bsearch( &v2, &index, prefix, itemfind ); + OUT( "[%ld] %p %s\n", index, item, + ( item? (char*)item : "(null)" ) ); + } + + // Clear out the vectors + (void) vector_resize( &v, 0, itemreclaim, (void*)0 ); + (void) vector_resize( &v2, 0, itemreclaim, (void*)0 ); } - return 0; }