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

NVArray.h

Go to the documentation of this file.
00001 #ifndef _NVArray_h_
00002 #define _NVArray_h_
00003 
00004 #include<iostream>
00005 
00006 #include"NVcontainer.h"
00007 
00008 using std::ostream;
00009 
00010 /* NVContainer Class Library */
00011 class NVArray;
00012 class NVArrayIter;
00013 
00019 class NVArray:public NVcontainer {
00020       protected:
00021         void make_current(void);
00022         nvoff_t *arrtab;
00023         unsigned long arrfst, arrlst;
00024 
00025         void sclear(void);
00026         void sset(unsigned long i, const char *data, size_t szdata);
00027         void sdel(unsigned long i);
00028         int sis_empty(void);
00029         int shas_element(unsigned long i);
00030         void sget(unsigned long i, char **data, size_t * szdata);
00031         void sprint(ostream & os);
00032 
00033       public:
00034         enum {
00035                 force = 0x1
00036         };
00037         NVArray():NVcontainer() {
00038         } NVArray(const char *dbname, int flags = 0);
00039 
00040         ASSERT(nvoff_t nvalloc(size_t rsz); void nvfree(nvoff_t p);)
00041 
00042         
00047         void open(const char *dbname, int flags = 0);
00048 
00049         void ssetsize(unsigned long fst, unsigned long lst);
00050 
00062         int setsize(unsigned long fst, unsigned long lst, int flags = 0);
00063 
00069         void getsize(unsigned long *fst, unsigned long *lst) {
00070                 // No lock necessary, because the user has to lock the NVArray
00071                 // himself, if he wants to have an accurate information.
00072                 *fst = arrfst;
00073                 *lst = arrlst;
00074         }
00075 
00076         void clear(void);
00077         void set(unsigned long i, const char *data, size_t szdata);
00078         void del(unsigned long i);
00079         int is_empty(void);
00080         int has_element(unsigned long i);
00081         void get(unsigned long i, const char **data, size_t * szdata);
00082         void print(ostream & os);
00083 };
00084 
00085 #ifdef NVArrayIter
00086 class NVArrayIter {
00087         NVHash *ht;
00088         NVHash::Record * pos;
00089         NVHash::Record * curtail;
00090         unsigned long curhashval;
00091       public:
00092         NVHashIter() {
00093                 ht = NULL;
00094                 pos = NULL;
00095         } NVHashIter(NVHash & nvl) {
00096                 ht = &nvl;
00097                 ht->lock(NVHash::ShrdLock);
00098                 pos = NULL;
00099         }
00100         ~NVHashIter() {
00101                 detach();
00102         }
00103 
00104         void attach(NVHash & nvl) {
00105                 detach();
00106                 ht = &nvl;
00107                 ht->lock(NVHash::ShrdLock);
00108                 pos = NULL;
00109         }
00110         void detach() {
00111                 if (ht) {
00112                         ht->lock(NVHash::UnLock);
00113                 }
00114                 ht = NULL;
00115         }
00116 
00117         void first() {
00118                 pos = NULL;
00119                 curhashval = 0;
00120                 while (curhashval < ht->hashsz) {
00121                         if (ht->hashtab[curhashval]) {
00122                                 curtail = ht->o2r(ht->hashtab[curhashval]);
00123                                 pos = ht->o2r(curtail->next);
00124                                 break;
00125                         }
00126                         curhashval++;
00127                 }
00128         }
00129         int valid() {
00130                 return pos != NULL;
00131         }
00132         void next() {
00133                 if (pos) {
00134                         if (pos == curtail) {
00135                                 pos = NULL;
00136                                 curhashval++;
00137                                 while (curhashval < ht->hashsz) {
00138                                         if (ht->hashtab[curhashval]) {
00139                                                 curtail =
00140                                                     ht->o2r(ht->
00141                                                             hashtab
00142                                                             [curhashval]);
00143                                                 pos =
00144                                                     ht->o2r(curtail->next);
00145                                                 break;
00146                                         }
00147                                         curhashval++;
00148                                 }
00149                         } else {
00150                                 pos = ht->o2r(pos->next);
00151                         }
00152                 }
00153         }
00154 
00155         void data(const char **data, unsigned int *szdata) {
00156                 (*data) =
00157                     ht->mem_p + ht->r2o(pos) + sizeof(NVHash::Record);
00158                 (*szdata) = pos->szdata;
00159         }
00160 
00161 };
00162 #endif
00163 
00164 #endif

Generated on Fri Aug 20 10:58:07 2004 for NewsCache by doxygen 1.3.6-20040222