00001 #ifndef _NVHash_h_ 00002 #define _NVHash_h_ 00003 00004 #include"NVlist.h" 00005 00006 /* NVContainer Class Library */ 00007 class NVHash; 00008 class NVHashIter; 00009 00015 class NVHash:public NVlist { 00016 friend class NVHashIter; 00017 00018 protected: 00019 void make_current(void); 00020 nvoff_t *hashtab; 00021 unsigned long hashsz; 00022 00023 int sis_empty(void); 00024 void sclear(void); 00025 void sadd(unsigned long h, const char *data, size_t szdata); 00026 void sprint(std::ostream & os); 00027 00028 public: 00029 NVHash():NVlist() { 00030 } NVHash(const char *dbname, unsigned long hashsz = 97, int flags = 00031 0); 00032 00039 void open(const char *dbname, unsigned long hashsz = 00040 97, int flags = 0); 00041 00046 unsigned long gethashsz(void) { 00047 // No lock and make_current invocation necessary, since 00048 // the hash-size must not change 00049 return hashsz; 00050 } 00051 00052 void clear(void); 00053 int is_empty(void); 00054 void add(unsigned long h, const char *data, size_t szdata); 00055 00056 void print(std::ostream & os); 00057 }; 00058 00064 class NVHashIter { 00065 NVHash *ht; 00066 NVHash::Record * pos; 00067 NVHash::Record * curtail; 00068 unsigned long curhashval; 00069 public: 00070 NVHashIter() { 00071 ht = NULL; 00072 pos = NULL; 00073 } NVHashIter(NVHash & nvl) { 00074 ht = &nvl; 00075 ht->lock(NVHash::ShrdLock); 00076 pos = NULL; 00077 } 00078 ~NVHashIter() { 00079 detach(); 00080 } 00081 00082 void attach(NVHash & nvl) { 00083 detach(); 00084 ht = &nvl; 00085 ht->lock(NVHash::ShrdLock); 00086 pos = NULL; 00087 } 00088 void detach() { 00089 if (ht) { 00090 ht->lock(NVHash::UnLock); 00091 } 00092 ht = NULL; 00093 } 00094 00095 void first() { 00096 pos = NULL; 00097 curhashval = 0; 00098 while (curhashval < ht->hashsz) { 00099 if (ht->hashtab[curhashval]) { 00100 curtail = ht->o2r(ht->hashtab[curhashval]); 00101 pos = ht->o2r(curtail->next); 00102 break; 00103 } 00104 curhashval++; 00105 } 00106 } 00107 int valid() { 00108 return pos != NULL; 00109 } 00110 void next() { 00111 if (pos) { 00112 if (pos == curtail) { 00113 pos = NULL; 00114 curhashval++; 00115 while (curhashval < ht->hashsz) { 00116 if (ht->hashtab[curhashval]) { 00117 curtail = 00118 ht->o2r(ht-> 00119 hashtab 00120 [curhashval]); 00121 pos = 00122 ht->o2r(curtail->next); 00123 break; 00124 } 00125 curhashval++; 00126 } 00127 } else { 00128 pos = ht->o2r(pos->next); 00129 } 00130 } 00131 } 00132 00133 void data(const char **data, unsigned int *szdata) { 00134 (*data) = 00135 ht->mem_p + ht->r2o(pos) + sizeof(NVHash::Record); 00136 (*szdata) = pos->szdata; 00137 } 00138 00139 }; 00140 00141 #endif
1.3.6-20040222