00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "listt_i.hpp"
00028
00029
00030
00031 Lix _SetPList::__seek(const _PList&a, const VOID * x) const
00032 {
00033 for (Lix p=a.first(); p!=0; p=a.next(p))
00034 if (_sameData(x,a._item(p))) return p;
00035 return 0;
00036 }
00037
00038
00039
00040 _PList& _SetPList::_create_d(const _PList& a)
00041 {
00042 if (h != a.h) { clear(); _add_d(a); }
00043 return *this;
00044 }
00045
00046
00047
00048 _PList& _SetPList::_create_p(_PList& a)
00049 {
00050 if (h != a.h) { clear(); _add_p(a); }
00051 return *this;
00052 }
00053
00054
00055
00056 BOOL _SetPList::OK(VOID) const
00057 {
00058 if (!_PList::OK()) return FALSE;
00059 for (Lix p=first(); p!=0; p=next(p))
00060 if (_seek(_item(p))!=p) return FALSE;
00061 return TRUE;
00062 }
00063
00064
00065
00066 Lix _SetPList::_add_d(const VOID* x)
00067 {
00068 if (!_contains(x)) return _append_d(x);
00069 return NULL;
00070 }
00071
00072
00073
00074 Lix _SetPList::_add_p(VOID* x)
00075 {
00076 if (!_contains(x)) return _append_p(x);
00077 return NULL;
00078 }
00079
00080
00081
00082 VOID _SetPList::_add_d(const _PList& a)
00083 {
00084 for (Lix p=a.first(); p!=0; p=a.next(p))
00085 if (!_contains(a._item(p))) __append(__newNode_d((_PListNode*)p));
00086 }
00087
00088
00089
00090 VOID _SetPList::_add_p(_PList& a)
00091 {
00092 for (Lix p=a.first(); p!=0; p=a.next(p))
00093 if (!_contains(a._item(p))) __append(__newNode_p((_PListNode*)p));
00094 }
00095
00096
00097
00098 VOID _SetPList::_add_mv(_PList& a, Lix ni, Lix nf, BOOL ovwrt, BOOL cdata )
00099 {
00100 _PListNode* t1 = (_PListNode*)(ni?ni:a.h);
00101 _PListNode* t2 = (_PListNode*)(nf?nf: a.h?a.h->b:0);
00102 #ifdef LIST_PTRVERIFY
00103 XLISTVERIFY(a,(Lix)t1,"_add_mv");
00104 XLISTVERIFY(a,(Lix)t2,"_add_mv");
00105 if (t1 && t2) assert(a.index(t1)<=a.index(t2));
00106 #endif
00107
00108 for (Lix p=(Lix)t1; p!=0; ) {
00109 Lix q = _seek(a._item(p));
00110 if (!q || ovwrt) {
00111 if (q) _del(q,cdata);
00112 q=a.__del(p,1);
00113 __append((_PListNode*)p);
00114 if (p==(Lix)t2) break;
00115 p=q;
00116 }
00117 else {
00118 if (p==(Lix)t2) break;
00119 p=a.next(p);
00120 }
00121 }
00122 }
00123
00124
00125
00126 BOOL _SetPList::_contains(const _PList& a) const
00127 {
00128 Lix p=a.first();
00129 if (!p) return (length()==0);
00130 for ( ; p!=0; p=a.next(p))
00131 if (!_contains(a._item(p))) return FALSE;
00132 return TRUE;
00133 }
00134
00135
00136
00137 BOOL _SetPList::_equals(const _PList& a, BOOL allowrep) const
00138 {
00139 if ((a.length()!=length()) && !allowrep) return FALSE;
00140 else return _contains(a);
00141 }
00142
00143
00144
00145 BOOL _SetPList::_erase(const VOID* x, BOOL cdata)
00146 {
00147 Lix p=_seek(x);
00148 if (p) {
00149 _del(p,cdata);
00150 return TRUE;
00151 }
00152 return FALSE;
00153 }
00154
00155
00156
00157 BOOL _SetPList::_erase(const _PList& a, BOOL cdata)
00158 {
00159 BOOL e = FALSE;
00160 for (Lix p=a.first(); p!=0; p=a.next(p))
00161 if (_erase(a._item(p),cdata)) e=TRUE;
00162 return e;
00163 }
00164
00165
00166
00167 VOID _SetPList::_keep(const _PList& a, BOOL cdata)
00168 {
00169 for (Lix p=first(); p!=0; ) {
00170 if (__seek(a,_item(p))==0)
00171 p=_del(p,1,cdata);
00172 else
00173 p=next(p);
00174 }
00175 }
00176
00177
00178
00179
00180
00181
00182 _PListNode *_KVPList::__newNode_d_kv( const VOID *key, const VOID *val )
00183 {
00184 VOID * k = _newData(key);
00185 VOID * v = _newVal(val);
00186 if ((!k) || (!v))
00187 LISTERROR("__newNode_d_kv","can't create data object (null new)");
00188
00189 return __newNode_p_kv(k,v);
00190 }
00191
00192
00193
00194 _PListNode *_KVPList::__newNode_p_kv( VOID *key, VOID *val )
00195 {
00196 _KVPListNode * t = new _KVPListNode(key,val);
00197
00198 if (!t)
00199 LISTERROR("__newNode_p_kv","can't create node object (null new)");
00200
00201 return t;
00202 }
00203
00204
00205
00206 #ifdef LIST_PTRVERIFY
00207 const VOID *_KVPList::_itemval(Lix p) const { if (p == 0) { LISTNONULL(p,"_itemval"); return 0; }; LISTVERIFY(p,"_itemval"); return ((_KVPListNode*)p)->vp; }
00208 const VOID *_KVPList::_itemval_first(VOID) const { if (h == 0) { LISTERROR("_itemval_first","empty list"); return 0; }; return ((_KVPListNode*)h)->vp; }
00209 const VOID *_KVPList::_itemval_last(VOID) const { if (h == 0) { LISTERROR("_itemval_last","empty list"); return 0; }; return ((_KVPListNode*)h->b)->vp; }
00210 #endif
00211
00212
00213
00214 VOID _KVPList::__exchange_p( _PListNode *n1, _PListNode *n2 )
00215 {
00216 VOID *tmp;
00217 __SWAP__( ((_KVPListNode*)n1)->dp, ((_KVPListNode*)n2)->dp, tmp);
00218 __SWAP__( ((_KVPListNode*)n1)->vp, ((_KVPListNode*)n2)->vp, tmp);
00219 }
00220
00221
00222
00223 Lix _KVPList::_insbefore_d_kv(LIINT i, const VOID* key, const VOID* val)
00224 {
00225 return _insbefore_d_kv(LIX_SAFE(i,"_insbefore_d_kv",TRUE),key,val);
00226 }
00227
00228
00229
00230 Lix _KVPList::_insbefore_p_kv(LIINT i, VOID* key, VOID* val)
00231 {
00232 return _insbefore_p_kv(LIX_SAFE(i,"_insbefore_p_kv",TRUE),key,val);
00233 }
00234
00235
00236
00237 Lix _KVPList::_insafter_d_kv(LIINT i, const VOID* key, const VOID* val)
00238 {
00239 return _insafter_d_kv(LIX_SAFE(i,"_insafter_d_kv",TRUE),key,val);
00240 }
00241
00242
00243
00244 Lix _KVPList::_insafter_p_kv(LIINT i, VOID* key, VOID* val)
00245 {
00246 return _insafter_p_kv(LIX_SAFE(i,"_insafter_p_kv",TRUE),key,val);
00247 }
00248
00249
00250
00251 const VOID* _KVPList::_itemval(LIINT i) const
00252 {
00253 return ((_KVPListNode*)LIX_SAFE(i,"_itemval",FALSE))->vp;
00254 }
00255
00256
00257
00258 const VOID * _KVPList::_val( const VOID *key ) const
00259 {
00260 Lix p=_seek(key);
00261 if (!p) {
00262 LISTERROR("_val","non existant key");
00263 return NULL;
00264 }
00265 return ((_KVPListNode*)p)->vp;
00266 }
00267
00268
00269
00270 const VOID * _KVPList::_val( const VOID *key, const VOID *defval ) const
00271 {
00272 Lix p=_seek(key);
00273 if (!p) return defval;
00274 return ((_KVPListNode*)p)->vp;
00275 }
00276
00277
00278
00279
00280
00281
00282
00283 Lix _KVPList::_add(const VOID* k, const VOID* v,
00284 BOOL rewrite, BOOL ovwrt, BOOL dup, BOOL cdata )
00285 {
00286 Lix p = _seek(k);
00287 if (!p) {
00288 if (dup) return _append_d_kv(k,v);
00289 else return _append_p_kv((VOID*)k,(VOID*)v);
00290 }
00291 if (rewrite) {
00292 if (ovwrt) _copyVal(*__itemvalptr(p),v);
00293 else {
00294 if (cdata) _deleteVal(*__itemvalptr(p));
00295 if (dup) *__itemvalptr(p)=_newVal(v);
00296 else *__itemvalptr(p)=(VOID*)v;
00297 }
00298 }
00299 return p;
00300 }
00301
00302
00303
00304 VOID _KVPList::_add(const _PList& a,
00305 BOOL rewrite, BOOL ovwrt, BOOL dup, BOOL cdata )
00306 {
00307 for (Lix p=a.first(); p!=0; p=a.next(p))
00308 _add(a._item(p),((_KVPList&)a)._itemval(p),rewrite,ovwrt,dup,cdata);
00309 }
00310
00311