| 1 | #include <stdlib.h>
|
|---|
| 2 | #include "bench.h"
|
|---|
| 3 | #include "c-pair.h"
|
|---|
| 4 | #include "c-stack.h"
|
|---|
| 5 |
|
|---|
| 6 | _Bool* new_bool( _Bool b ) {
|
|---|
| 7 | _Bool* q = malloc(sizeof(_Bool));
|
|---|
| 8 | *q = b;
|
|---|
| 9 | return q;
|
|---|
| 10 | }
|
|---|
| 11 |
|
|---|
| 12 | char* new_char( char c ) {
|
|---|
| 13 | char* q = malloc(sizeof(char));
|
|---|
| 14 | *q = c;
|
|---|
| 15 | return q;
|
|---|
| 16 | }
|
|---|
| 17 |
|
|---|
| 18 | int* new_int( int i ) {
|
|---|
| 19 | int* q = malloc(sizeof(int));
|
|---|
| 20 | *q = i;
|
|---|
| 21 | return q;
|
|---|
| 22 | }
|
|---|
| 23 |
|
|---|
| 24 | void* copy_bool( const void* p ) { return new_bool( *(const _Bool*)p ); }
|
|---|
| 25 |
|
|---|
| 26 | void* copy_char( const void* p ) { return new_char( *(const char*)p ); }
|
|---|
| 27 |
|
|---|
| 28 | void* copy_int( const void* p ) { return new_int( *(const int*)p ); }
|
|---|
| 29 |
|
|---|
| 30 | void* copy_pair_bool_char( const void* p ) { return copy_pair( p, copy_bool, copy_char ); }
|
|---|
| 31 |
|
|---|
| 32 | void free_pair_bool_char( void* p ) { free_pair( p, free, free ); }
|
|---|
| 33 |
|
|---|
| 34 | int cmp_bool( const void* a, const void* b ) {
|
|---|
| 35 | return *(const _Bool*)a == *(const _Bool*)b ? 0 : *(const _Bool*)a < *(const _Bool*)b ? -1 : 1;
|
|---|
| 36 | }
|
|---|
| 37 |
|
|---|
| 38 | int cmp_char( const void* a, const void* b ) {
|
|---|
| 39 | return *(const char*)a == *(const char*)b ? 0 : *(const char*)a < *(const char*)b ? -1 : 1;
|
|---|
| 40 | }
|
|---|
| 41 |
|
|---|
| 42 | int main(int argc, char** argv) {
|
|---|
| 43 | srand(20171025);
|
|---|
| 44 |
|
|---|
| 45 | struct stack s = new_stack();
|
|---|
| 46 | REPEAT_TIMED( "push_int",
|
|---|
| 47 | push_stack(&s, new_int( rand() ));
|
|---|
| 48 | )
|
|---|
| 49 |
|
|---|
| 50 | struct stack t;
|
|---|
| 51 | TIMED( "copy_int",
|
|---|
| 52 | copy_stack(&t, &s, copy_int);
|
|---|
| 53 | )
|
|---|
| 54 |
|
|---|
| 55 | TIMED( "clear_int",
|
|---|
| 56 | clear_stack(&s, free);
|
|---|
| 57 | )
|
|---|
| 58 |
|
|---|
| 59 | int max = 0;
|
|---|
| 60 | REPEAT_TIMED( "pop_int",
|
|---|
| 61 | int* x = pop_stack(&t);
|
|---|
| 62 | if ( *x > max ) { max = *x; }
|
|---|
| 63 | free(x);
|
|---|
| 64 | )
|
|---|
| 65 |
|
|---|
| 66 | struct stack s2 = new_stack();
|
|---|
| 67 | REPEAT_TIMED( "push_bool_char",
|
|---|
| 68 | push_stack(&s2, new_pair( new_bool( rand() & 0x1 ), new_char( rand() & 0x7F ) ));
|
|---|
| 69 | )
|
|---|
| 70 |
|
|---|
| 71 | struct stack t2;
|
|---|
| 72 | TIMED( "copy_bool_char",
|
|---|
| 73 | copy_stack(&t2, &s2, copy_pair_bool_char);
|
|---|
| 74 | )
|
|---|
| 75 |
|
|---|
| 76 | TIMED( "clear_bool_char",
|
|---|
| 77 | clear_stack(&s2, free_pair_bool_char);
|
|---|
| 78 | )
|
|---|
| 79 |
|
|---|
| 80 | struct pair* max2 = new_pair( new_bool(0), new_char('\0') );
|
|---|
| 81 | REPEAT_TIMED( "pop_bool_char",
|
|---|
| 82 | struct pair* x = pop_stack(&t2);
|
|---|
| 83 | if ( cmp_pair( x, max2, cmp_bool, cmp_char ) > 0 ) {
|
|---|
| 84 | free_pair_bool_char( max2 );
|
|---|
| 85 | max2 = x;
|
|---|
| 86 | } else {
|
|---|
| 87 | free_pair_bool_char( x );
|
|---|
| 88 | }
|
|---|
| 89 | )
|
|---|
| 90 | free_pair_bool_char( max2 );
|
|---|
| 91 | }
|
|---|