further camelcase fixing
[rrq/rrqmisc.git] / tests / vectortests.c
1 /**
2  * A sequence of tests of the Vector.h functions.
3  */
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <Vector.h>
8
9 #define OUT(...) fprintf( stderr, __VA_ARGS__ )
10
11 // dump an item; return 0 to stop
12 static void itemdump(const VectorIndex index,const void *slot) {
13     if ( slot ) {
14         OUT ( "[%ld] %s\n", index, (const char*) slot );
15     }
16 }
17
18 // pretend-reclaim item and return data (as int)
19 static int itemreclaim(Vector *pv,VectorIndex index,void *item,void *data) {
20     int r = data? 1 : 0;
21     OUT( "reclaim [%ld] (%p) => %d\n", index, item, r );
22     return r;
23 }
24
25 // Compare two items strings, or nulls
26 static int itemcmp(const void *a,const void *b) {
27     return a? ( b? strcmp( (char*)b, (char*)a ) : 1 ) : ( b? -1 : 0 );
28 }
29
30 // Iterator function
31 static int itemiter(VectorIndex index,void *item,void *data) {
32     char *s = "";
33     if ( item ) {
34         s = (char*) item;
35     }
36     OUT( "[%ld] %p %s\n", index, item, s );
37     return ( index < 12 ) == 0;
38 }
39
40 // check if item before, at or after the key
41 int itemfind(const void *key, const void *item) {
42     char *a = (char*) key;
43     size_t an = a? strlen( a ) : 0;
44     char *b = (char*) item;
45     size_t bn = b? strlen( b ) : 0;
46     OUT( "itemfind %p \"%s\" %p \"%s\"\n",
47          a, a? a : "(null)", b, b? b : "(null)" );
48     return strncmp( a, b, (an<bn)? an : bn );
49 }
50
51 // Dump a Vector with a header line
52 static void my_Vector_dump(
53     Vector *vp,
54     void (*itemdump)(const VectorIndex index,const void *slot) )
55 {
56     OUT( "Vector %p has %ld slots\n", vp, Vector_size(vp) );
57     Vector_dump( vp, itemdump );
58 }
59
60 static char *item25 = "this is first item";
61 static char *item75 = "this is second item";
62
63 int main(int argc,char **argv) {
64     int variant = 0;
65     for ( ; variant < 4; variant++ ) {
66         OUT( "variant = %d ========================\n", variant );
67         Vector v = { variant, 100, 0 }; // Create an empty Vector of 100 slots.
68
69         //OUT( "VECTOR_LEVEL_BITS = %d\n", VECTOR_LEVEL_BITS );
70         //OUT( "sizeof( VectorIndex ) = %ld\n", sizeof( VectorIndex ) );
71         //OUT( "VECTOR_INDEX_BITS - %ld\n", VECTOR_INDEX_BITS );
72         //OUT( "VECTOR_INDEX_FIELDS = %ld\n", VECTOR_INDEX_FIELDS );
73         OUT( "VECTOR_SLOTS = %ld\n", VECTOR_SLOTS( &v ) );
74         // OUT( "sizeof( Vector_page ) = %ld\n", sizeof( Vector_page ) );
75         OUT( "sizeof( Vector ) = %ld\n", sizeof( Vector ) );
76
77         void ** slot;
78         void *item;
79         int i;
80     
81         OUT( "Vector v has 100 empty slots\n" );
82
83         // void Vector_dump(Vector *pv,
84         //        int (*itemdump)(const VectorIndex ,const void *));
85         // void **Vector_next_used(Vector *pv,VectorIndex *index);
86         my_Vector_dump( &v, itemdump );
87
88         //void Vector_set(Vector *pv,VectorIndex index,void *value);
89         item = item25;
90         Vector_set( &v, 25, item );
91         OUT( "assigned 25 to %p %s\n", item, (char*)item );
92
93         // void **Vector_prev_used(Vector *pv,VectorIndex *index);
94         int t0[6] = { 0, 25, 50, 99, 100, 1000 };
95         OUT( "Vector_next_used:\n" );
96         for ( i = 0; i < 6; i++ ) {
97             VectorIndex index = t0[i];
98             slot = Vector_next_used( &v, &index );
99             OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 );
100         }
101
102         OUT( "Vector_prev_used:\n" );
103         for ( i = 0; i < 6; i++ ) {
104             VectorIndex index = t0[i];
105             slot = Vector_prev_used( &v, &index );
106             OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 );
107         }
108
109         item = item75;
110         Vector_set( &v, 75, item );
111         OUT( "assigned 75 to %p %s\n", item, (char*)item );
112
113         my_Vector_dump( &v, itemdump );
114     
115         OUT( "Vector_next_used:\n" );
116         for ( i = 0; i < 6; i++ ) {
117             VectorIndex index = t0[i];
118             slot = Vector_next_used( &v, &index );
119             OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 );
120         }
121
122         OUT( "Vector_prev_used:\n" );
123         for ( i = 0; i < 6; i++ ) {
124             VectorIndex index = t0[i];
125             slot = Vector_prev_used( &v, &index );
126             OUT( " [%d] => [%ld] %p\n", t0[i], index, slot? *slot : 0 );
127         }
128
129         OUT( "shrinking the Vector:\n" );
130         // int Vector_resize(
131         //     Vector *pv, VectorIndex new_size,
132         //     int (*reclaim)(Vector *pv,VectorIndex index,
133         //                    void *item, void *data),
134         //     void *data );
135         i = Vector_resize( &v, 50, itemreclaim, (void*)1 );
136         OUT( "shrink to 50 (reclaim refused) = %d\n", i );
137          
138
139         i = Vector_resize( &v, 50, itemreclaim, (void*)0 );
140         OUT( "shrink to 50 (accept reclaim) = %d\n", i );
141
142         i = Vector_resize( &v, 508, 0, 0 );
143         OUT( "grow to 508 (no reclaim) = %d\n", i );
144
145         // void **Vector_entry(Vector *pv,VectorIndex index); 
146 #define SLOTSTR(slot) (slot? ((*slot)? *slot : "(nil)") : "(unassigned)" )
147         slot = Vector_entry( &v, 24 );
148         itemdump( 24, SLOTSTR(slot) );
149
150         slot = Vector_entry( &v, 25 );
151         itemdump( 25, SLOTSTR(slot) );
152
153         slot = Vector_entry( &v, 300 );
154         itemdump( 300, SLOTSTR( slot ) );
155
156         //#define Vector_size(pv) ((VectorIndex) (pv)->size)
157         OUT( "Vector size: %ld\n", Vector_size( &v ) );
158
159         // void *Vector_get(Vector *pv,VectorIndex index);
160         // void *Vector_get_set(Vector *pv,VectorIndex index,void *value);
161         item = Vector_get( &v, 25 );
162         OUT( "old item 25 is %p %s\n", item, (char*)item );
163         item = "another value";
164         OUT( "new item 25 is %p %s\n", item, (char*)item );
165         item = Vector_get_set( &v, 25, item );
166         OUT( "got item 25 as %p %s\n", item, (char*)item );
167         item = Vector_get( &v, 25 );
168         OUT( "now item 25 is %p %s\n", item, (char*)item );
169
170         // void Vector_append(Vector *pv,void *value);
171         item = "the very last item";
172         OUT( "appending %p %s\n", item, (char*)item );
173         Vector_append( &v, item );
174
175         OUT( "Vector size: %ld\n", Vector_size( &v ) );
176         my_Vector_dump( &v, itemdump );
177
178         Vector v2 = { variant, 200, 0 };
179         // void Vector_copy(
180         //        Vector *dst,VectorIndex di,
181         //        Vector *src,VectorIndex si,
182         //        VectorIndex n);
183         Vector_copy( &v2, 20, &v, 10, 20 );
184         my_Vector_dump( &v2, itemdump );
185
186         Vector_resize( &v2, 0, itemreclaim, 0 ); // Reset Vector v2
187         my_Vector_dump( &v2, itemdump );
188
189         Vector_append( &v2, "9 the very last item" );
190         Vector_append( &v2, "3 the very last item" );
191         Vector_append( &v2, "4 the very last item" );
192         Vector_append( &v2, "6 the very last item" );
193         Vector_append( &v2, "5 the very last item" );
194         Vector_resize( &v2, Vector_size( &v2 ) + 3, 0, 0 );
195         Vector_append( &v2, "2 the very last item" );
196         Vector_append( &v2, "8 the very last item" );
197         Vector_append( &v2, "1 the very last item" );
198         Vector_append( &v2, 0 );
199         Vector_append( &v2, "7 the very last item" );
200         Vector_append( &v2, "0 the very last item" );
201         my_Vector_dump( &v2, itemdump );
202
203         // void Vector_qsort(Vector*,int (*compar)(const void *,const void *));
204         OUT( "sorted:" );
205         Vector_qsort( &v2, itemcmp );
206         my_Vector_dump( &v2, itemdump );
207
208         // void Vector_iterate(Vector *pv,
209         //          VectorIndex start,
210         //          int (*itemfn)(VectorIndex,void *item,void *data),
211         //          void *data);
212         OUT( "showing slots from 4 to 12\n" );
213         Vector_iterate( &v2, 4, itemiter, 0 );
214
215         // void *Vector_bsearch(Vector *pv,VectorIndex *index,const void *key,
216         //           int (*compare)(const void *key, const void *item));
217         char *pfx[5] = { "4", "9", "0", "3", "10" };
218         for ( i = 0; i < ( sizeof( pfx ) / sizeof( char* ) ); i++ ) {
219             char *prefix = pfx[i];
220             VectorIndex index = 0;
221             OUT( "lookup prefix \"%s\":\n", prefix );
222             item = Vector_bsearch( &v2, &index, prefix, itemfind );
223             OUT( "[%ld] %p %s\n", index, item,
224                  ( item? (char*)item : "(null)" ) );
225         }
226
227         // Clear out the Vectors
228         (void) Vector_resize( &v, 0, itemreclaim, (void*)0 );
229         (void) Vector_resize( &v2, 0, itemreclaim, (void*)0 );
230     }
231     return 0;
232 }