00001
00006
00007
00008
00009
00010
00011
00012
00013
00019
00021
00022 template <class K, class V, class C>
00023 inline CTBmapBrowser<K,V,C>::CTBmapBrowser()
00024 : mp_map(0),
00025 mp_node(0)
00026 {}
00027
00028
00030
00031 template <class K, class V, class C>
00032 inline CTBmapBrowser<K,V,C>::CTBmapBrowser(const CTBmap<K,V,C>* p_map,
00033 const CTBmapNode<K,V,C>* p_node)
00034 : mp_map((CTBmap<K,V,C>*) p_map),
00035 mp_node((CTBmapNode<K,V,C>*) p_node)
00036 {}
00037
00038
00040
00041 template <class K, class V, class C>
00042 inline bool CTBmapBrowser<K,V,C>::Next()
00043 {
00044 if (!mp_map || !mp_node) return false;
00045 mp_node = mp_node->Next();
00046 return mp_node;
00047 }
00048
00049
00051
00052 template <class K, class V, class C>
00053 inline bool CTBmapBrowser<K,V,C>::Prev()
00054 {
00055 if (!mp_map || !mp_node) return false;
00056 mp_node = mp_node->Prev();
00057 return mp_node;
00058 }
00059
00060
00062
00063 template <class K, class V, class C>
00064 inline bool CTBmapBrowser<K,V,C>::Valid() const
00065 {
00066 return mp_node;
00067 }
00068
00069
00071
00072 template <class K, class V, class C>
00073 inline bool CTBmapBrowser<K,V,C>::IsFirst() const
00074 {
00075 return mp_map && mp_node == (const Node*) ((CTBbtree*)mp_map)->First();
00076 }
00077
00078
00080
00081 template <class K, class V, class C>
00082 inline bool CTBmapBrowser<K,V,C>::IsLast() const
00083 {
00084 return mp_map && mp_node == (const Node*) ((CTBbtree*)mp_map)->Last();
00085 }
00086
00087
00089
00090 template <class K, class V, class C>
00091 inline CTBint CTBmapBrowser<K,V,C>::Rank() const
00092 {
00093 return mp_node->Rank();
00094 }
00095
00096
00098
00099 template <class K, class V, class C>
00100 inline bool CTBmapBrowser<K,V,C>::Equal(const CTBmapBrowser<K,V,C>& rhs) const
00101 {
00102 return mp_map == rhs.mp_map && mp_node == rhs.mp_node;
00103 }
00104
00105
00107
00108 template <class K, class V, class C>
00109 inline const CTBpair<const K,V>* CTBmapBrowser<K,V,C>::Current() const
00110 {
00111 return mp_node ? &(mp_node->Pair()) : 0;
00112 }
00113
00114
00116
00117 template <class K, class V, class C>
00118 inline const K& CTBmapBrowser<K,V,C>::Key() const
00119 {
00120 return mp_node->Key();
00121 }
00122
00123
00125
00126 template <class K, class V, class C>
00127 inline const V& CTBmapBrowser<K,V,C>::Value() const
00128 {
00129 return mp_node->Value();
00130 }
00131
00132
00134
00135 template <class K, class V, class C>
00136 inline CTBmapBrowser<K,V,C>& CTBmapBrowser<K,V,C>::operator++()
00137 {
00138 if (mp_node) mp_node = mp_node->Next();
00139 return *this;
00140 }
00141
00142
00144
00145 template <class K, class V, class C>
00146 inline CTBmapBrowser<K,V,C> CTBmapBrowser<K,V,C>::operator++(int)
00147 {
00148 Browser tmp = *this;
00149 if (mp_node) mp_node = mp_node->Next();
00150 return tmp;
00151 }
00152
00153
00155
00156 template <class K, class V, class C>
00157 inline CTBmapBrowser<K,V,C>& CTBmapBrowser<K,V,C>::operator--()
00158 {
00159 if (mp_node) mp_node = mp_node->Prev();
00160 return *this;
00161 }
00162
00163
00165
00166 template <class K, class V, class C>
00167 inline CTBmapBrowser<K,V,C> CTBmapBrowser<K,V,C>::operator--(int)
00168 {
00169 Browser tmp = *this;
00170 if (mp_node) mp_node = mp_node->Prev();
00171 return tmp;
00172 }
00173
00174
00176
00177 template <class K, class V, class C>
00178 inline const CTBpair<const K,V>& CTBmapBrowser<K,V,C>::operator[](
00179 CTBint i_offset)
00180 {
00181 Browser p = *this + i_offset;
00182 return *p;
00183 }
00184
00185
00187
00188 template <class K, class V, class C>
00189 inline const CTBpair<const K,V>* CTBmapBrowser<K,V,C>::operator->()
00190 {
00191 return &(mp_node->Pair());
00192 }
00193
00194
00196
00197 template <class K, class V, class C>
00198 inline const CTBpair<const K,V>& CTBmapBrowser<K,V,C>::operator*()
00199 {
00200 return mp_node->Pair();
00201 }
00202
00203
00205
00206 template <class K, class V, class C>
00207 inline CTBmapBrowser<K,V,C>& CTBmapBrowser<K,V,C>::operator+=(CTBint i_offset)
00208 {
00209 if (mp_node) mp_node = mp_node->Skip(i_offset);
00210 return *this;
00211 }
00212
00213
00215
00216 template <class K, class V, class C>
00217 inline CTBmapBrowser<K,V,C>& CTBmapBrowser<K,V,C>::operator-=(CTBint i_offset)
00218 {
00219 if (mp_node) mp_node = mp_node->Skip(-i_offset);
00220 return *this;
00221 }
00222
00223
00225
00226 template <class K, class V, class C>
00227 inline CTBmapBrowser<K,V,C>::operator const CTBpair<const K,V>*() const
00228 {
00229 return mp_node ? &(mp_node->Pair()) : 0;
00230 }
00231
00232
00234
00235 template <class K, class V, class C>
00236 inline CTBmapBrowser<K,V,C>::operator bool() const
00237 {
00238 return mp_node;
00239 }
00240
00241
00243
00244 template <class K, class V, class C>
00245 inline CTBmapBrowser<K,V,C>::operator const CTBmapNode<K,V,C>*() const
00246 {
00247 return mp_node;
00248 }
00249
00250
00256 template <class K, class V, class C>
00257 inline CTBmapBrowser<K,V,C> operator+(const CTBmapBrowser<K,V,C>& lhs,
00258 CTBint i_offset)
00259 {
00260 CTBmapBrowser<K,V,C> tmp = lhs;
00261
00262 tmp += i_offset;
00263 return tmp;
00264 }
00265
00266
00272 template <class K, class V, class C>
00273 inline CTBmapBrowser<K,V,C> operator-(const CTBmapBrowser<K,V,C>& lhs,
00274 CTBint i_offset)
00275 {
00276 CTBmapBrowser<K,V,C> tmp = *lhs;
00277
00278 tmp -= i_offset;
00279 return tmp;
00280 }
00281
00282
00288 template <class K, class V, class C>
00289 inline CTBint operator-(const CTBmapBrowser<K,V,C>& lhs,
00290 const CTBmapBrowser<K,V,C>& rhs)
00291 {
00292 CTBint i_lhsrank = ((CTBmapNode<K,V,C>*) lhs)->Rank();
00293 CTBint i_rhsrank = ((CTBmapNode<K,V,C>*) rhs)->Rank();
00294
00295 return i_lhsrank - rhsrank;
00296 }
00297
00298
00304 template <class K, class V, class C>
00305 inline bool operator==(const CTBmapBrowser<K,V,C>& lhs,
00306 const CTBmapBrowser<K,V,C>& rhs)
00307 {
00308 return lhs.Equal(rhs);
00309 }
00310
00311
00317 template <class K, class V, class C>
00318 inline ostream& operator<<(ostream& os, const CTBmapBrowser<K,V,C>& obj)
00319 {
00320 os << "(" << mp_map << "," << mp_node << ")";
00321 return *os;
00322 }
00323
00324
00325
00331
00333
00334 template <class K, class V, class C>
00335 inline CTBmapIterator<K,V,C>::CTBmapIterator()
00336 : CTBmapBrowser<K,V,C>()
00337 {}
00338
00339
00341
00342 template <class K, class V, class C>
00343 inline CTBmapIterator<K,V,C>::CTBmapIterator(CTBmap<K,V,C>* p_map,
00344 CTBmapNode<K,V,C>* p_node)
00345 : CTBmapBrowser<K,V,C>(p_map,p_node)
00346 {}
00347
00348
00350
00351 template <class K, class V, class C>
00352 inline CTBpair<const K,V>* CTBmapIterator<K,V,C>::Current() const
00353 {
00354 return mp_node ? &(mp_node->Pair()) : 0;
00355 }
00356
00357
00359
00360 template <class K, class V, class C>
00361 inline V& CTBmapIterator<K,V,C>::Value() const
00362 {
00363 return mp_node->Value();
00364 }
00365
00366
00368
00369 template <class K, class V, class C>
00370 inline CTBmapIterator<K,V,C>& CTBmapIterator<K,V,C>::operator++()
00371 {
00372 if (mp_node) mp_node = mp_node->Next();
00373 return *this;
00374 }
00375
00376
00378
00379 template <class K, class V, class C>
00380 inline CTBmapIterator<K,V,C> CTBmapIterator<K,V,C>::operator++(int)
00381 {
00382 Iterator tmp = *this;
00383 if (mp_node) mp_node = mp_node->Next();
00384 return tmp;
00385 }
00386
00387
00389
00390 template <class K, class V, class C>
00391 inline CTBmapIterator<K,V,C>& CTBmapIterator<K,V,C>::operator--()
00392 {
00393 if (mp_node) mp_node = mp_node->Prev();
00394 return *this;
00395 }
00396
00397
00399
00400 template <class K, class V, class C>
00401 inline CTBmapIterator<K,V,C> CTBmapIterator<K,V,C>::operator--(int)
00402 {
00403 Iterator tmp = *this;
00404 if (mp_node) mp_node = mp_node->Prev();
00405 return tmp;
00406 }
00407
00408
00410
00411 template <class K, class V, class C>
00412 inline CTBpair<const K,V>& CTBmapIterator<K,V,C>::operator[]( CTBint i_offset)
00413 {
00414 Iterator p = *this + i_offset;
00415 return *p;
00416 }
00417
00418
00420
00421 template <class K, class V, class C>
00422 inline CTBpair<const K,V>* CTBmapIterator<K,V,C>::operator->()
00423 {
00424 return &(mp_node->Pair());
00425 }
00426
00427
00429
00430 template <class K, class V, class C>
00431 inline CTBpair<const K,V>& CTBmapIterator<K,V,C>::operator*()
00432 {
00433 return mp_node->Pair();
00434 }
00435
00436
00438
00439 template <class K, class V, class C>
00440 inline CTBmapIterator<K,V,C>& CTBmapIterator<K,V,C>::operator+=(CTBint i_offset)
00441 {
00442 if (mp_node) mp_node = mp_node->Skip(i_offset);
00443 return *this;
00444 }
00445
00446
00448
00449 template <class K, class V, class C>
00450 inline CTBmapIterator<K,V,C>& CTBmapIterator<K,V,C>::operator-=(CTBint i_offset)
00451 {
00452 if (mp_node) mp_node = mp_node->Skip(-i_offset);
00453 return *this;
00454 }
00455
00456
00458
00459 template <class K, class V, class C>
00460 inline CTBmapIterator<K,V,C>::operator CTBpair<const K,V>*() const
00461 {
00462 return mp_node ? &(mp_node->Pair()) : 0;
00463 }
00464
00465
00467
00468 template <class K, class V, class C>
00469 inline CTBmapIterator<K,V,C>::operator bool() const
00470 {
00471 return mp_node;
00472 }
00473
00474
00476
00477 template <class K, class V, class C>
00478 inline CTBmapIterator<K,V,C>::operator CTBmapNode<K,V,C>*() const
00479 {
00480 return mp_node;
00481 }
00482
00483
00489 template <class K, class V, class C>
00490 inline CTBmapIterator<K,V,C> operator+(const CTBmapIterator<K,V,C>& lhs,
00491 CTBint i_offset)
00492 {
00493 CTBmapIterator<K,V,C> tmp = lhs;
00494
00495 tmp += i_offset;
00496 return tmp;
00497 }
00498
00499
00505 template <class K, class V, class C>
00506 inline CTBmapIterator<K,V,C> operator-(const CTBmapIterator<K,V,C>& lhs,
00507 CTBint i_offset)
00508 {
00509 CTBmapIterator<K,V,C> tmp = *lhs;
00510
00511 tmp -= i_offset;
00512 return tmp;
00513 }
00514