00001 #ifndef _NVArray_h_
00002 #define _NVArray_h_
00003
00004 #include<iostream>
00005
00006 #include"NVcontainer.h"
00007
00008 using std::ostream;
00009
00010
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
00071
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