Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

NVHash.h

Go to the documentation of this file.
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

Generated on Sun Oct 24 21:08:19 2004 for NewsCache by doxygen 1.3.6-20040222