X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=tests%2Fvectortests.c;h=44bb9652db6c8d292eb0db5e8e513be5d211f68f;hb=HEAD;hp=30169dc26e59d272382de61101fbb13dfa3ef76b;hpb=a0be49ff8fda77c328424c09d6d0ad4a9f7e8f66;p=rrq%2Frrqmisc.git diff --git a/tests/vectortests.c b/tests/vectortests.c index 30169dc..44bb965 100644 --- a/tests/vectortests.c +++ b/tests/vectortests.c @@ -1,22 +1,22 @@ /** - * A sequence of tests of the vector.h functions. + * A sequence of tests of the Vector.h functions. */ #include #include -#include +#include #define OUT(...) fprintf( stderr, __VA_ARGS__ ) // dump an item; return 0 to stop -static void itemdump(const vector_index index,const void *slot) { +static void itemdump(const VectorIndex index,const void *slot) { if ( slot ) { OUT ( "[%ld] %s\n", index, (const char*) slot ); } } // pretend-reclaim item and return data (as int) -static int itemreclaim(vector *pv,vector_index index,void *item,void *data) { +static int itemreclaim(Vector *pv,VectorIndex index,void *item,void *data) { int r = data? 1 : 0; OUT( "reclaim [%ld] (%p) => %d\n", index, item, r ); return r; @@ -28,7 +28,7 @@ static int itemcmp(const void *a,const void *b) { } // Iterator function -static int itemiter(vector_index index,void *item,void *data) { +static int itemiter(VectorIndex index,void *item,void *data) { char *s = ""; if ( item ) { s = (char*) item; @@ -48,160 +48,185 @@ int itemfind(const void *key, const void *item) { return strncmp( a, b, (an [%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 VectorIndex ,const void *)); + // void **Vector_next_used(Vector *pv,VectorIndex *index); + my_Vector_dump( &v, itemdump ); + + //void Vector_set(Vector *pv,VectorIndex 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,VectorIndex *index); + int t0[6] = { 0, 25, 50, 99, 100, 1000 }; + OUT( "Vector_next_used:\n" ); + for ( i = 0; i < 6; i++ ) { + VectorIndex 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++ ) { + VectorIndex 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++ ) { + VectorIndex 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++ ) { + VectorIndex 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, VectorIndex new_size, + // int (*reclaim)(Vector *pv,VectorIndex 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,VectorIndex 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) ((VectorIndex) (pv)->size) + OUT( "Vector size: %ld\n", Vector_size( &v ) ); + + // void *Vector_get(Vector *pv,VectorIndex index); + // void *Vector_get_set(Vector *pv,VectorIndex 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,VectorIndex di, + // Vector *src,VectorIndex si, + // VectorIndex 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, + // VectorIndex start, + // int (*itemfn)(VectorIndex,void *item,void *data), + // void *data); + OUT( "showing slots from 4 to 12\n" ); + Vector_iterate( &v2, 4, itemiter, 0 ); + + // void *Vector_bsearch(Vector *pv,VectorIndex *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]; + VectorIndex 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; }