00001
00006
00007
00008
00009
00010
00011
00012
00013
00019
00021
00022 template <class K, class V, class C, class T, class AK, class AV>
00023 inline CTBgsetBrowser<K,V,C,T,AK,AV>::CTBgsetBrowser()
00024 : mp_gset(0),
00025 mp_node(0)
00026 {}
00027
00028
00030
00031 template <class K, class V, class C, class T, class AK, class AV>
00032 inline CTBgsetBrowser<K,V,C,T,AK,AV>::CTBgsetBrowser(
00033 const CTBgset<K,V,C,T,AK,AV>* p_gset,
00034 const CTBgsetNode<K,V,C,T,AK,AV>* p_node)
00035 : mp_gset((CTBgset<K,V,C,T,AK,AV>*) p_gset),
00036 mp_node((CTBgsetNode<K,V,C,T,AK,AV>*) p_node)
00037 {}
00038
00039
00041
00042 template <class K, class V, class C, class T, class AK, class AV>
00043 inline bool CTBgsetBrowser<K,V,C,T,AK,AV>::Next()
00044 {
00045 if (!mp_gset || !mp_node) return false;
00046 mp_node = mp_node->Next();
00047 return mp_node;
00048 }
00049
00050
00052
00053 template <class K, class V, class C, class T, class AK, class AV>
00054 inline bool CTBgsetBrowser<K,V,C,T,AK,AV>::Prev()
00055 {
00056 if (!mp_gset || !mp_node) return false;
00057 mp_node = mp_node->Prev();
00058 return mp_node;
00059 }
00060
00061
00063
00064 template <class K, class V, class C, class T, class AK, class AV>
00065 inline bool CTBgsetBrowser<K,V,C,T,AK,AV>::Valid() const
00066 {
00067 return mp_node;
00068 }
00069
00070
00072
00073 template <class K, class V, class C, class T, class AK, class AV>
00074 inline bool CTBgsetBrowser<K,V,C,T,AK,AV>::IsFirst() const
00075 {
00076 return mp_gset && mp_node == (const Node*) ((CTBbtree*)mp_gset)->First();
00077 }
00078
00079
00081
00082 template <class K, class V, class C, class T, class AK, class AV>
00083 inline bool CTBgsetBrowser<K,V,C,T,AK,AV>::IsLast() const
00084 {
00085 return mp_gset && mp_node == (const Node*) ((CTBbtree*)mp_gset)->Last();
00086 }
00087
00088
00090
00091 template <class K, class V, class C, class T, class AK, class AV>
00092 inline CTBint CTBgsetBrowser<K,V,C,T,AK,AV>::Rank() const
00093 {
00094 return mp_node->Rank();
00095 }
00096
00097
00099
00100 template <class K, class V, class C, class T, class AK, class AV>
00101 inline bool CTBgsetBrowser<K,V,C,T,AK,AV>::Equal(
00102 const CTBgsetBrowser<K,V,C,T,AK,AV>& rhs) const
00103 {
00104 return mp_gset == rhs.mp_gset && mp_node == rhs.mp_node;
00105 }
00106
00107
00109
00110 template <class K, class V, class C, class T, class AK, class AV>
00111 inline const K& CTBgsetBrowser<K,V,C,T,AK,AV>::Key() const
00112 {
00113 return mp_node->Key();
00114 }
00115
00116
00118
00119 template <class K, class V, class C, class T, class AK, class AV>
00120 inline const V& CTBgsetBrowser<K,V,C,T,AK,AV>::Value() const
00121 {
00122 return mp_node->Value();
00123 }
00124
00125
00127
00128 template <class K, class V, class C, class T, class AK, class AV>
00129 inline const T& CTBgsetBrowser<K,V,C,T,AK,AV>::Object() const
00130 {
00131 return mp_node->Object();
00132 }
00133
00134
00136
00137 template <class K, class V, class C, class T, class AK, class AV>
00138 inline CTBgsetBrowser<K,V,C,T,AK,AV>& CTBgsetBrowser<K,V,C,T,AK,AV>::operator++()
00139 {
00140 if (mp_node) mp_node = mp_node->Next();
00141 return *this;
00142 }
00143
00144
00146
00147 template <class K, class V, class C, class T, class AK, class AV>
00148 inline CTBgsetBrowser<K,V,C,T,AK,AV> CTBgsetBrowser<K,V,C,T,AK,AV>::operator++(int)
00149 {
00150 Browser tmp = *this;
00151 if (mp_node) mp_node = mp_node->Next();
00152 return tmp;
00153 }
00154
00155
00157
00158 template <class K, class V, class C, class T, class AK, class AV>
00159 inline CTBgsetBrowser<K,V,C,T,AK,AV>& CTBgsetBrowser<K,V,C,T,AK,AV>::operator--()
00160 {
00161 if (mp_node) mp_node = mp_node->Prev();
00162 return *this;
00163 }
00164
00165
00167
00168 template <class K, class V, class C, class T, class AK, class AV>
00169 inline CTBgsetBrowser<K,V,C,T,AK,AV> CTBgsetBrowser<K,V,C,T,AK,AV>::operator--(int)
00170 {
00171 Browser tmp = *this;
00172 if (mp_node) mp_node = mp_node->Prev();
00173 return tmp;
00174 }
00175
00176
00178
00179 template <class K, class V, class C, class T, class AK, class AV>
00180 inline const T& CTBgsetBrowser<K,V,C,T,AK,AV>::operator[](CTBint i_offset)
00181 {
00182 Browser p = *this + i_offset;
00183 return *p;
00184 }
00185
00186
00188
00189 template <class K, class V, class C, class T, class AK, class AV>
00190 inline const T* CTBgsetBrowser<K,V,C,T,AK,AV>::operator->()
00191 {
00192 return &(mp_node->Object());
00193 }
00194
00195
00197
00198 template <class K, class V, class C, class T, class AK, class AV>
00199 inline const T& CTBgsetBrowser<K,V,C,T,AK,AV>::operator*()
00200 {
00201 return mp_node->Object();
00202 }
00203
00204
00206
00207 template <class K, class V, class C, class T, class AK, class AV>
00208 inline CTBgsetBrowser<K,V,C,T,AK,AV>& CTBgsetBrowser<K,V,C,T,AK,AV>::operator+=(
00209 CTBint i_offset)
00210 {
00211 if (mp_node) mp_node = mp_node->Skip(i_offset);
00212 return *this;
00213 }
00214
00215
00217
00218 template <class K, class V, class C, class T, class AK, class AV>
00219 inline CTBgsetBrowser<K,V,C,T,AK,AV>& CTBgsetBrowser<K,V,C,T,AK,AV>::operator-=(
00220 CTBint i_offset)
00221 {
00222 if (mp_node) mp_node = mp_node->Skip(-i_offset);
00223 return *this;
00224 }
00225
00226
00228
00229 template <class K, class V, class C, class T, class AK, class AV>
00230 inline CTBgsetBrowser<K,V,C,T,AK,AV>::operator const T*() const
00231 {
00232 return mp_node ? &(mp_node->Object()) : 0;
00233 }
00234
00235
00237
00238 template <class K, class V, class C, class T, class AK, class AV>
00239 inline CTBgsetBrowser<K,V,C,T,AK,AV>::operator bool() const
00240 {
00241 return mp_node;
00242 }
00243
00244
00246
00247 template <class K, class V, class C, class T, class AK, class AV>
00248 inline CTBgsetBrowser<K,V,C,T,AK,AV>::operator const CTBgsetNode<K,V,C,T,AK,AV>*() const
00249 {
00250 return mp_node;
00251 }
00252
00253
00259 template <class K, class V, class C, class T, class AK, class AV>
00260 inline CTBgsetBrowser<K,V,C,T,AK,AV> operator+(
00261 const CTBgsetBrowser<K,V,C,T,AK,AV>& lhs,
00262 CTBint i_offset)
00263 {
00264 CTBgsetBrowser<K,V,C,T,AK,AV> tmp = lhs;
00265
00266 tmp += i_offset;
00267 return tmp;
00268 }
00269
00270
00276 template <class K, class V, class C, class T, class AK, class AV>
00277 inline CTBgsetBrowser<K,V,C,T,AK,AV> operator-(
00278 const CTBgsetBrowser<K,V,C,T,AK,AV>& lhs,
00279 CTBint i_offset)
00280 {
00281 CTBgsetBrowser<K,V,C,T,AK,AV> tmp = *lhs;
00282
00283 tmp -= i_offset;
00284 return tmp;
00285 }
00286
00287
00293 template <class K, class V, class C, class T, class AK, class AV>
00294 inline CTBint operator-(const CTBgsetBrowser<K,V,C,T,AK,AV>& lhs,
00295 const CTBgsetBrowser<K,V,C,T,AK,AV>& rhs)
00296 {
00297 CTBint i_lhsrank = ((CTBgsetNode<K,V,C,T,AK,AV>*) lhs)->Rank();
00298 CTBint i_rhsrank = ((CTBgsetNode<K,V,C,T,AK,AV>*) rhs)->Rank();
00299
00300 return i_lhsrank - rhsrank;
00301 }
00302
00303
00309 template <class K, class V, class C, class T, class AK, class AV>
00310 inline bool operator==(const CTBgsetBrowser<K,V,C,T,AK,AV>& lhs,
00311 const CTBgsetBrowser<K,V,C,T,AK,AV>& rhs)
00312 {
00313 return lhs.Equal(rhs);
00314 }
00315
00316
00322 template <class K, class V, class C, class T, class AK, class AV>
00323 inline ostream& operator<<(ostream& os,
00324 const CTBgsetBrowser<K,V,C,T,AK,AV>& obj)
00325 {
00326 os << "(" << mp_gset << "," << mp_node << ")";
00327 return *os;
00328 }
00329
00330
00331
00337
00339
00340 template <class K, class V, class C, class T, class AK, class AV>
00341 inline CTBgsetIterator<K,V,C,T,AK,AV>::CTBgsetIterator()
00342 : CTBgsetBrowser<K,V,C,T,AK,AV>()
00343 {}
00344
00345
00347
00348 template <class K, class V, class C, class T, class AK, class AV>
00349 inline CTBgsetIterator<K,V,C,T,AK,AV>::CTBgsetIterator(
00350 CTBgset<K,V,C,T,AK,AV>* p_gset,
00351 CTBgsetNode<K,V,C,T,AK,AV>* p_node)
00352 : CTBgsetBrowser<K,V,C,T,AK,AV>(p_gset,p_node)
00353 {}
00354
00355
00357
00358 template <class K, class V, class C, class T, class AK, class AV>
00359 inline V& CTBgsetIterator<K,V,C,T,AK,AV>::Value() const
00360 {
00361 return mp_node->Value();
00362 }
00363
00364
00366
00367 template <class K, class V, class C, class T, class AK, class AV>
00368 inline T& CTBgsetIterator<K,V,C,T,AK,AV>::Object() const
00369 {
00370 return mp_node->Object();
00371 }
00372
00373
00375
00376 template <class K, class V, class C, class T, class AK, class AV>
00377 inline CTBgsetIterator<K,V,C,T,AK,AV>& CTBgsetIterator<K,V,C,T,AK,AV>::operator++()
00378 {
00379 if (mp_node) mp_node = mp_node->Next();
00380 return *this;
00381 }
00382
00383
00385
00386 template <class K, class V, class C, class T, class AK, class AV>
00387 inline CTBgsetIterator<K,V,C,T,AK,AV> CTBgsetIterator<K,V,C,T,AK,AV>::operator++(int)
00388 {
00389 Iterator tmp = *this;
00390 if (mp_node) mp_node = mp_node->Next();
00391 return tmp;
00392 }
00393
00394
00396
00397 template <class K, class V, class C, class T, class AK, class AV>
00398 inline CTBgsetIterator<K,V,C,T,AK,AV>& CTBgsetIterator<K,V,C,T,AK,AV>::operator--()
00399 {
00400 if (mp_node) mp_node = mp_node->Prev();
00401 return *this;
00402 }
00403
00404
00406
00407 template <class K, class V, class C, class T, class AK, class AV>
00408 inline CTBgsetIterator<K,V,C,T,AK,AV> CTBgsetIterator<K,V,C,T,AK,AV>::operator--(int)
00409 {
00410 Iterator tmp = *this;
00411 if (mp_node) mp_node = mp_node->Prev();
00412 return tmp;
00413 }
00414
00415
00417
00418 template <class K, class V, class C, class T, class AK, class AV>
00419 inline T& CTBgsetIterator<K,V,C,T,AK,AV>::operator[](CTBint i_offset)
00420 {
00421 Iterator p = *this + i_offset;
00422 return *p;
00423 }
00424
00425
00427
00428 template <class K, class V, class C, class T, class AK, class AV>
00429 inline T* CTBgsetIterator<K,V,C,T,AK,AV>::operator->()
00430 {
00431 return &(mp_node->Object());
00432 }
00433
00434
00436
00437 template <class K, class V, class C, class T, class AK, class AV>
00438 inline T& CTBgsetIterator<K,V,C,T,AK,AV>::operator*()
00439 {
00440 return mp_node->Object();
00441 }
00442
00443
00445
00446 template <class K, class V, class C, class T, class AK, class AV>
00447 inline CTBgsetIterator<K,V,C,T,AK,AV>& CTBgsetIterator<K,V,C,T,AK,AV>::operator+=(CTBint i_offset)
00448 {
00449 if (mp_node) mp_node = mp_node->Skip(i_offset);
00450 return *this;
00451 }
00452
00453
00455
00456 template <class K, class V, class C, class T, class AK, class AV>
00457 inline CTBgsetIterator<K,V,C,T,AK,AV>& CTBgsetIterator<K,V,C,T,AK,AV>::operator-=(CTBint i_offset)
00458 {
00459 if (mp_node) mp_node = mp_node->Skip(-i_offset);
00460 return *this;
00461 }
00462
00463
00465
00466 template <class K, class V, class C, class T, class AK, class AV>
00467 inline CTBgsetIterator<K,V,C,T,AK,AV>::operator T*() const
00468 {
00469 return mp_node ? &(mp_node->Object()) : 0;
00470 }
00471
00472
00474
00475 template <class K, class V, class C, class T, class AK, class AV>
00476 inline CTBgsetIterator<K,V,C,T,AK,AV>::operator bool() const
00477 {
00478 return mp_node;
00479 }
00480
00481
00483
00484 template <class K, class V, class C, class T, class AK, class AV>
00485 inline CTBgsetIterator<K,V,C,T,AK,AV>::operator CTBgsetNode<K,V,C,T,AK,AV>*() const
00486 {
00487 return mp_node;
00488 }
00489
00490
00496 template <class K, class V, class C, class T, class AK, class AV>
00497 inline CTBgsetIterator<K,V,C,T,AK,AV> operator+(
00498 const CTBgsetIterator<K,V,C,T,AK,AV>& lhs, CTBint i_offset)
00499 {
00500 CTBgsetIterator<K,V,C,T,AK,AV> tmp = lhs;
00501
00502 tmp += i_offset;
00503 return tmp;
00504 }
00505
00506
00512 template <class K, class V, class C, class T, class AK, class AV>
00513 inline CTBgsetIterator<K,V,C,T,AK,AV> operator-(
00514 const CTBgsetIterator<K,V,C,T,AK,AV>& lhs, CTBint i_offset)
00515 {
00516 CTBgsetIterator<K,V,C,T,AK,AV> tmp = *lhs;
00517
00518 tmp -= i_offset;
00519 return tmp;
00520 }
00521