00001 #include <stdio.h>
00002 #include <assert.h>
00003 #include "hcontainer.h"
00004 #include "hash_table.h"
00005
00006
00007 #define NUM_INSERT (1000)
00008 #define NUM_DELETE (NUM_INSERT/2)
00009
00010 typedef struct test_s
00011 {
00012 int x;
00013 double y;
00014 float *z;
00015 } test_t;
00016
00017
00018 void deep_copy(const void *dst1, const void *src1)
00019 {
00020 test_t *dst, *src;
00021 dst = (test_t *) dst1;
00022 src = (test_t *) src1;
00023
00024 *dst = *src;
00025 dst->z = (float *)malloc(10*sizeof(float));
00026 memcpy(dst->z, src->z, 10*sizeof(float));
00027 }
00028
00029 void deep_free(const void *ptr1)
00030 {
00031 test_t *ptr;
00032 ptr = (test_t *)ptr1;
00033 free(ptr->z);
00034 }
00035
00036 void print(test_t *ptr)
00037 {
00038 int i;
00039 if (ptr)
00040 {
00041 printf("x = %d, y = %lf, z = [", ptr->x, ptr->y);
00042 for (i=0; i<10; i++)
00043 printf(" %f",ptr->z[i]);
00044 printf("]\n");
00045 }
00046 else
00047 printf("EMPTY\n");
00048 }
00049
00050 main()
00051 {
00052 int i,j, count;
00053 HContainer_t hc, hc1;
00054 test_t *ptr, *ptr2;
00055 char key[10];
00056 HIterator_t hit;
00057
00058
00059 hcon_init(&hc, sizeof(test_t), 12, deep_free, deep_copy);
00060
00061
00062 for (j=0; j<NUM_INSERT; j++)
00063 {
00064 sprintf(key,"key%06d",j);
00065 ptr = hcon_allocslot(&hc, key);
00066 ptr->x = (int) j;
00067 ptr->y = (double) j;
00068 ptr->z = (float *)malloc(10*sizeof(float));
00069 for (i=0; i<10; i++)
00070 ptr->z[i] = (float)i;
00071
00072
00073 ptr2 = hcon_lookup(&hc, key);
00074 assert(ptr2==ptr);
00075 }
00076
00077
00078 sprintf(key,"key%06d",NUM_INSERT/2);
00079 ptr = hcon_lookup(&hc, key);
00080 print(ptr);
00081
00082
00083
00084 hcon_copy(&hc1, &hc);
00085 ptr = hcon_lookup(&hc1, key);
00086 print(ptr);
00087
00088
00089 hcon_remove(&hc1, key);
00090
00091
00092 ptr = hcon_lookup(&hc1, key);
00093 print(ptr);
00094
00095
00096
00097
00098 ptr = hcon_lookup(&hc, key);
00099 print(ptr);
00100
00101
00102 hcon_stat(&hc1);
00103
00104
00105 hcon_free(&hc);
00106
00107
00108
00109 for (i=0; i<NUM_DELETE; i++)
00110 {
00111 sprintf(key,"key%06d",rand()%NUM_INSERT);
00112 hcon_remove(&hc1,key);
00113 }
00114
00115
00116 hcon_stat(&hc1);
00117
00118
00119
00120 hiter_new(&hit, &hc1);
00121 count = 0;
00122 while( (ptr=hiter_getnext(&hit)) != NULL )
00123 {
00124 count++;
00125 print(ptr);
00126 }
00127 printf("Count = %d\n",count);
00128
00129 hcon_free(&hc1);
00130 }
00131
00132
00133
00134