| #include <assert.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include "bit_array.h" | |
| #define SIZE (8*sizeof(int)*3) | |
| static bit_array array; | |
| static int simple_array[SIZE]; | |
| static int bits; | |
| int are_equal() | |
| { | |
| int i; | |
| for (i=0 ; i < SIZE ; i++) | |
| if (SampleBit(&array,i) != simple_array[i]){ | |
| printf("failed bit %d (packed=%d, simple=%d)\n", i, | |
| SampleBit(&array,i), simple_array[i]); | |
| return 0; | |
| } | |
| return 1; | |
| } | |
| int is_same_vacant() | |
| { | |
| int vacant; | |
| for (vacant =0 ; simple_array[vacant]!=0 ; vacant++) | |
| if ( vacant >= SIZE) { | |
| vacant=-1; | |
| break; | |
| } | |
| if ( VacantBit(&array) == vacant ) | |
| return 1; | |
| else | |
| return 0; | |
| } | |
| void assign_both(int bit_nr, int bit_val) | |
| { | |
| int old_bit= simple_array[bit_nr]; | |
| simple_array[bit_nr]= bit_val; | |
| bits+=bit_val - old_bit; | |
| assert(AssignBit(&array, bit_nr, bit_val) == old_bit); | |
| assert(are_equal()); | |
| assert(is_same_vacant()); | |
| } | |
| int main() | |
| { | |
| unsigned int integers[SIZE >> 5]; | |
| int i,j; | |
| assert( AssembleArray(&array, integers, SIZE) | |
| == &array); | |
| ResetArray(&array); | |
| for (i=0 ; i<SIZE ; i++) | |
| simple_array[i]=0; | |
| for (j=5 ; j ; j--) { | |
| printf("\rleft %d\r",j); | |
| for (i=0 ; VacantBit(&array) != -1 ; i++ ) { | |
| if (i % 256 == 0) { | |
| printf("left %d ",j); | |
| printf("%3d up \r", bits); | |
| fflush(stdout); | |
| } | |
| assign_both(rand() % SIZE, | |
| (rand()% SIZE > bits ) ? 0 : 1 ); | |
| } | |
| assign_both(rand() % SIZE, 1); | |
| for (i=0 ; bits ; i++ ) { | |
| if (i % 256 == 0) { | |
| printf("left %d ",j); | |
| printf("%3d down\r", bits); | |
| fflush(stdout); | |
| } | |
| assign_both(rand() % SIZE, | |
| (rand()% SIZE <= (SIZE-bits) ) ? 0 : 1 ); | |
| } | |
| assign_both(rand() % SIZE, 0); | |
| } | |
| putchar('\n'); | |
| return 0; | |
| } |