Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef __IRR_MAP_H_INCLUDED__
00006 #define __IRR_MAP_H_INCLUDED__
00007
00008 #include "irrTypes.h"
00009 #include "irrMath.h"
00010
00011 namespace irr
00012 {
00013 namespace core
00014 {
00015
00017 template <class KeyType, class ValueType>
00018 class map
00019 {
00021 template <class KeyTypeRB, class ValueTypeRB>
00022 class RBTree
00023 {
00024 public:
00025
00026 RBTree(const KeyTypeRB& k, const ValueTypeRB& v)
00027 : LeftChild(0), RightChild(0), Parent(0), Key(k),
00028 Value(v), IsRed(true) {}
00029
00030 void setLeftChild(RBTree* p)
00031 {
00032 LeftChild=p;
00033 if (p)
00034 p->setParent(this);
00035 }
00036
00037 void setRightChild(RBTree* p)
00038 {
00039 RightChild=p;
00040 if (p)
00041 p->setParent(this);
00042 }
00043
00044 void setParent(RBTree* p) { Parent=p; }
00045
00046 void setValue(const ValueTypeRB& v) { Value = v; }
00047
00048 void setRed() { IsRed = true; }
00049 void setBlack() { IsRed = false; }
00050
00051 RBTree* getLeftChild() const { return LeftChild; }
00052 RBTree* getRightChild() const { return RightChild; }
00053 RBTree* getParent() const { return Parent; }
00054
00055 const ValueTypeRB& getValue() const
00056 {
00057 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00058 return Value;
00059 }
00060
00061 ValueTypeRB& getValue()
00062 {
00063 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00064 return Value;
00065 }
00066
00067 const KeyTypeRB& getKey() const
00068 {
00069 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00070 return Key;
00071 }
00072
00073 bool isRoot() const
00074 {
00075 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00076 return Parent==0;
00077 }
00078
00079 bool isLeftChild() const
00080 {
00081 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00082 return (Parent != 0) && (Parent->getLeftChild()==this);
00083 }
00084
00085 bool isRightChild() const
00086 {
00087 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00088 return (Parent!=0) && (Parent->getRightChild()==this);
00089 }
00090
00091 bool isLeaf() const
00092 {
00093 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00094 return (LeftChild==0) && (RightChild==0);
00095 }
00096
00097 unsigned int getLevel() const
00098 {
00099 if (isRoot())
00100 return 1;
00101 else
00102 return getParent()->getLevel() + 1;
00103 }
00104
00105
00106 bool isRed() const
00107 {
00108 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00109 return IsRed;
00110 }
00111
00112 bool isBlack() const
00113 {
00114 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00115 return !IsRed;
00116 }
00117
00118 private:
00119 RBTree();
00120
00121 RBTree* LeftChild;
00122 RBTree* RightChild;
00123
00124 RBTree* Parent;
00125
00126 KeyTypeRB Key;
00127 ValueTypeRB Value;
00128
00129 bool IsRed;
00130 };
00131
00132 public:
00133
00134 typedef RBTree<KeyType,ValueType> Node;
00135
00136 class ConstIterator;
00137
00139 class Iterator
00140 {
00141 friend class ConstIterator;
00142 public:
00143
00144 Iterator() : Root(0), Cur(0) {}
00145
00146
00147 Iterator(Node* root) : Root(root)
00148 {
00149 reset();
00150 }
00151
00152
00153 Iterator(const Iterator& src) : Root(src.Root), Cur(src.Cur) {}
00154
00155 void reset(bool atLowest=true)
00156 {
00157 if (atLowest)
00158 Cur = getMin(Root);
00159 else
00160 Cur = getMax(Root);
00161 }
00162
00163 bool atEnd() const
00164 {
00165 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00166 return Cur==0;
00167 }
00168
00169 Node* getNode() const
00170 {
00171 return Cur;
00172 }
00173
00174 Iterator& operator=(const Iterator& src)
00175 {
00176 Root = src.Root;
00177 Cur = src.Cur;
00178 return (*this);
00179 }
00180
00181 void operator++(int)
00182 {
00183 inc();
00184 }
00185
00186 void operator--(int)
00187 {
00188 dec();
00189 }
00190
00191 Node* operator->()
00192 {
00193 return getNode();
00194 }
00195
00196 Node& operator*()
00197 {
00198 _IRR_DEBUG_BREAK_IF(atEnd())
00199
00200 return *Cur;
00201 }
00202
00203 private:
00204
00205 Node* getMin(Node* n) const
00206 {
00207 while(n && n->getLeftChild())
00208 n = n->getLeftChild();
00209 return n;
00210 }
00211
00212 Node* getMax(Node* n) const
00213 {
00214 while(n && n->getRightChild())
00215 n = n->getRightChild();
00216 return n;
00217 }
00218
00219 void inc()
00220 {
00221
00222 if (Cur==0)
00223 return;
00224
00225 if (Cur->getRightChild())
00226 {
00227
00228
00229 Cur = getMin(Cur->getRightChild());
00230 }
00231 else if (Cur->isLeftChild())
00232 {
00233
00234
00235 Cur = Cur->getParent();
00236 }
00237 else
00238 {
00239
00240
00241
00242
00243
00244 while(Cur->isRightChild())
00245 Cur = Cur->getParent();
00246 Cur = Cur->getParent();
00247 }
00248 }
00249
00250 void dec()
00251 {
00252
00253 if (Cur==0)
00254 return;
00255
00256 if (Cur->getLeftChild())
00257 {
00258
00259
00260 Cur = getMax(Cur->getLeftChild());
00261 }
00262 else if (Cur->isRightChild())
00263 {
00264
00265
00266 Cur = Cur->getParent();
00267 }
00268 else
00269 {
00270
00271
00272
00273
00274
00275
00276 while(Cur->isLeftChild())
00277 Cur = Cur->getParent();
00278 Cur = Cur->getParent();
00279 }
00280 }
00281
00282 Node* Root;
00283 Node* Cur;
00284 };
00285
00287 class ConstIterator
00288 {
00289 friend class Iterator;
00290 public:
00291
00292 ConstIterator() : Root(0), Cur(0) {}
00293
00294
00295 ConstIterator(const Node* root) : Root(root)
00296 {
00297 reset();
00298 }
00299
00300
00301 ConstIterator(const ConstIterator& src) : Root(src.Root), Cur(src.Cur) {}
00302 ConstIterator(const Iterator& src) : Root(src.Root), Cur(src.Cur) {}
00303
00304 void reset(bool atLowest=true)
00305 {
00306 if (atLowest)
00307 Cur = getMin(Root);
00308 else
00309 Cur = getMax(Root);
00310 }
00311
00312 bool atEnd() const
00313 {
00314 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00315 return Cur==0;
00316 }
00317
00318 const Node* getNode() const
00319 {
00320 return Cur;
00321 }
00322
00323 ConstIterator& operator=(const ConstIterator& src)
00324 {
00325 Root = src.Root;
00326 Cur = src.Cur;
00327 return (*this);
00328 }
00329
00330 void operator++(int)
00331 {
00332 inc();
00333 }
00334
00335 void operator--(int)
00336 {
00337 dec();
00338 }
00339
00340 const Node* operator->()
00341 {
00342 return getNode();
00343 }
00344
00345 const Node& operator*()
00346 {
00347 _IRR_DEBUG_BREAK_IF(atEnd())
00348
00349 return *Cur;
00350 }
00351
00352 private:
00353
00354 const Node* getMin(const Node* n) const
00355 {
00356 while(n && n->getLeftChild())
00357 n = n->getLeftChild();
00358 return n;
00359 }
00360
00361 const Node* getMax(const Node* n) const
00362 {
00363 while(n && n->getRightChild())
00364 n = n->getRightChild();
00365 return n;
00366 }
00367
00368 void inc()
00369 {
00370
00371 if (Cur==0)
00372 return;
00373
00374 if (Cur->getRightChild())
00375 {
00376
00377
00378 Cur = getMin(Cur->getRightChild());
00379 }
00380 else if (Cur->isLeftChild())
00381 {
00382
00383
00384 Cur = Cur->getParent();
00385 }
00386 else
00387 {
00388
00389
00390
00391
00392
00393 while(Cur->isRightChild())
00394 Cur = Cur->getParent();
00395 Cur = Cur->getParent();
00396 }
00397 }
00398
00399 void dec()
00400 {
00401
00402 if (Cur==0)
00403 return;
00404
00405 if (Cur->getLeftChild())
00406 {
00407
00408
00409 Cur = getMax(Cur->getLeftChild());
00410 }
00411 else if (Cur->isRightChild())
00412 {
00413
00414
00415 Cur = Cur->getParent();
00416 }
00417 else
00418 {
00419
00420
00421
00422
00423
00424
00425 while(Cur->isLeftChild())
00426 Cur = Cur->getParent();
00427 Cur = Cur->getParent();
00428 }
00429 }
00430
00431 const Node* Root;
00432 const Node* Cur;
00433 };
00434
00435
00437
00441 class ParentFirstIterator
00442 {
00443 public:
00444
00445 ParentFirstIterator() : Root(0), Cur(0) {}
00446
00447 explicit ParentFirstIterator(Node* root) : Root(root), Cur(0)
00448 {
00449 reset();
00450 }
00451
00452 void reset()
00453 {
00454 Cur = Root;
00455 }
00456
00457 bool atEnd() const
00458 {
00459 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00460 return Cur==0;
00461 }
00462
00463 Node* getNode()
00464 {
00465 return Cur;
00466 }
00467
00468 ParentFirstIterator& operator=(const ParentFirstIterator& src)
00469 {
00470 Root = src.Root;
00471 Cur = src.Cur;
00472 return (*this);
00473 }
00474
00475 void operator++(int)
00476 {
00477 inc();
00478 }
00479
00480 Node* operator -> ()
00481 {
00482 return getNode();
00483 }
00484
00485 Node& operator* ()
00486 {
00487 _IRR_DEBUG_BREAK_IF(atEnd())
00488
00489 return *getNode();
00490 }
00491
00492 private:
00493
00494 void inc()
00495 {
00496
00497 if (Cur==0)
00498 return;
00499
00500
00501 if (Cur->getLeftChild())
00502 {
00503 Cur = Cur->getLeftChild();
00504 }
00505 else if (Cur->getRightChild())
00506 {
00507
00508 Cur = Cur->getRightChild();
00509 }
00510 else
00511 {
00512
00513
00514
00515 while (Cur!=0)
00516 {
00517
00518
00519
00520 if (Cur->isLeftChild() && Cur->getParent()->getRightChild())
00521 {
00522 Cur = Cur->getParent()->getRightChild();
00523 return;
00524 }
00525 Cur = Cur->getParent();
00526 }
00527 }
00528 }
00529
00530 Node* Root;
00531 Node* Cur;
00532
00533 };
00534
00535
00537
00541 class ParentLastIterator
00542 {
00543 public:
00544
00545 ParentLastIterator() : Root(0), Cur(0) {}
00546
00547 explicit ParentLastIterator(Node* root) : Root(root), Cur(0)
00548 {
00549 reset();
00550 }
00551
00552 void reset()
00553 {
00554 Cur = getMin(Root);
00555 }
00556
00557 bool atEnd() const
00558 {
00559 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00560 return Cur==0;
00561 }
00562
00563 Node* getNode()
00564 {
00565 return Cur;
00566 }
00567
00568 ParentLastIterator& operator=(const ParentLastIterator& src)
00569 {
00570 Root = src.Root;
00571 Cur = src.Cur;
00572 return (*this);
00573 }
00574
00575 void operator++(int)
00576 {
00577 inc();
00578 }
00579
00580 Node* operator -> ()
00581 {
00582 return getNode();
00583 }
00584
00585 Node& operator* ()
00586 {
00587 _IRR_DEBUG_BREAK_IF(atEnd())
00588
00589 return *getNode();
00590 }
00591 private:
00592
00593 Node* getMin(Node* n)
00594 {
00595 while(n!=0 && (n->getLeftChild()!=0 || n->getRightChild()!=0))
00596 {
00597 if (n->getLeftChild())
00598 n = n->getLeftChild();
00599 else
00600 n = n->getRightChild();
00601 }
00602 return n;
00603 }
00604
00605 void inc()
00606 {
00607
00608 if (Cur==0)
00609 return;
00610
00611
00612
00613
00614
00615
00616 if (Cur->isLeftChild() && Cur->getParent()->getRightChild())
00617 {
00618 Cur = getMin(Cur->getParent()->getRightChild());
00619 }
00620 else
00621 Cur = Cur->getParent();
00622 }
00623
00624 Node* Root;
00625 Node* Cur;
00626 };
00627
00628
00629
00630
00631
00632
00633
00634
00635 class AccessClass
00636 {
00637
00638 friend class map<KeyType, ValueType>;
00639
00640 public:
00641
00642
00643 void operator=(const ValueType& value)
00644 {
00645
00646 Tree.set(Key,value);
00647 }
00648
00649
00650 operator ValueType()
00651 {
00652 Node* node = Tree.find(Key);
00653
00654
00655 _IRR_DEBUG_BREAK_IF(node==0)
00656
00657 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00658 return node->getValue();
00659 }
00660
00661 private:
00662
00663 AccessClass(map& tree, const KeyType& key) : Tree(tree), Key(key) {}
00664
00665 AccessClass();
00666
00667 map& Tree;
00668 const KeyType& Key;
00669 };
00670
00671
00672
00673 map() : Root(0), Size(0) {}
00674
00675
00676 ~map()
00677 {
00678 clear();
00679 }
00680
00681
00682
00683
00684
00686
00689 bool insert(const KeyType& keyNew, const ValueType& v)
00690 {
00691
00692 Node* newNode = new Node(keyNew,v);
00693 if (!insert(newNode))
00694 {
00695 delete newNode;
00696 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00697 return false;
00698 }
00699
00700
00701 while (!newNode->isRoot() && (newNode->getParent()->isRed()))
00702 {
00703 if (newNode->getParent()->isLeftChild())
00704 {
00705
00706 Node* newNodesUncle = newNode->getParent()->getParent()->getRightChild();
00707 if ( newNodesUncle!=0 && newNodesUncle->isRed())
00708 {
00709
00710 newNode->getParent()->setBlack();
00711 newNodesUncle->setBlack();
00712 newNode->getParent()->getParent()->setRed();
00713
00714 newNode = newNode->getParent()->getParent();
00715 }
00716 else
00717 {
00718
00719 if ( newNode->isRightChild())
00720 {
00721
00722
00723 newNode = newNode->getParent();
00724 rotateLeft(newNode);
00725 }
00726
00727 newNode->getParent()->setBlack();
00728 newNode->getParent()->getParent()->setRed();
00729 rotateRight(newNode->getParent()->getParent());
00730 }
00731 }
00732 else
00733 {
00734
00735 Node* newNodesUncle = newNode->getParent()->getParent()->getLeftChild();
00736 if ( newNodesUncle!=0 && newNodesUncle->isRed())
00737 {
00738
00739 newNode->getParent()->setBlack();
00740 newNodesUncle->setBlack();
00741 newNode->getParent()->getParent()->setRed();
00742
00743 newNode = newNode->getParent()->getParent();
00744 }
00745 else
00746 {
00747
00748 if (newNode->isLeftChild())
00749 {
00750
00751
00752 newNode = newNode->getParent();
00753 rotateRight(newNode);
00754 }
00755
00756 newNode->getParent()->setBlack();
00757 newNode->getParent()->getParent()->setRed();
00758 rotateLeft(newNode->getParent()->getParent());
00759 }
00760
00761 }
00762 }
00763
00764 Root->setBlack();
00765 return true;
00766 }
00767
00769
00771 void set(const KeyType& k, const ValueType& v)
00772 {
00773 Node* p = find(k);
00774 if (p)
00775 p->setValue(v);
00776 else
00777 insert(k,v);
00778 }
00779
00781
00784 Node* delink(const KeyType& k)
00785 {
00786 Node* p = find(k);
00787 if (p == 0)
00788 return 0;
00789
00790
00791
00792 while(p->getRightChild())
00793 {
00794
00795 rotateLeft(p);
00796 }
00797
00798 Node* left = p->getLeftChild();
00799
00800
00801 if (p->isLeftChild())
00802 p->getParent()->setLeftChild(left);
00803
00804 else if (p->isRightChild())
00805 p->getParent()->setRightChild(left);
00806
00807 else
00808 {
00809
00810
00811 setRoot(left);
00812 }
00813
00814
00815
00816
00817 --Size;
00818 return p;
00819 }
00820
00822
00823 bool remove(const KeyType& k)
00824 {
00825 Node* p = find(k);
00826 return remove(p);
00827 }
00828
00830
00831 bool remove(Node* p)
00832 {
00833 if (p == 0)
00834 {
00835 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00836 return false;
00837 }
00838
00839
00840
00841 while(p->getRightChild())
00842 {
00843
00844 rotateLeft(p);
00845 }
00846
00847 Node* left = p->getLeftChild();
00848
00849
00850 if (p->isLeftChild())
00851 p->getParent()->setLeftChild(left);
00852
00853 else if (p->isRightChild())
00854 p->getParent()->setRightChild(left);
00855
00856 else
00857 {
00858
00859
00860 setRoot(left);
00861 }
00862
00863
00864
00865 delete p;
00866
00867 --Size;
00868 return true;
00869 }
00870
00872 void clear()
00873 {
00874 ParentLastIterator i(getParentLastIterator());
00875
00876 while(!i.atEnd())
00877 {
00878 Node* p = i.getNode();
00879 i++;
00880
00881 delete p;
00882 }
00883 Root = 0;
00884 Size= 0;
00885 }
00886
00889 bool empty() const
00890 {
00891 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
00892 return Root == 0;
00893 }
00894
00896 _IRR_DEPRECATED_ bool isEmpty() const
00897 {
00898 return empty();
00899 }
00900
00904 Node* find(const KeyType& keyToFind) const
00905 {
00906 Node* pNode = Root;
00907
00908 while(pNode!=0)
00909 {
00910 const KeyType& key=pNode->getKey();
00911
00912 if (keyToFind == key)
00913 return pNode;
00914 else if (keyToFind < key)
00915 pNode = pNode->getLeftChild();
00916 else
00917 pNode = pNode->getRightChild();
00918 }
00919
00920 return 0;
00921 }
00922
00926 Node* getRoot() const
00927 {
00928 return Root;
00929 }
00930
00932 u32 size() const
00933 {
00934 return Size;
00935 }
00936
00938
00942 void swap(map<KeyType, ValueType>& other)
00943 {
00944 core::swap(Root, other.Root);
00945 core::swap(Size, other.Size);
00946 }
00947
00948
00949
00950
00951
00953 Iterator getIterator() const
00954 {
00955 Iterator it(getRoot());
00956 return it;
00957 }
00958
00960 ConstIterator getConstIterator() const
00961 {
00962 Iterator it(getRoot());
00963 return it;
00964 }
00965
00971 ParentFirstIterator getParentFirstIterator() const
00972 {
00973 ParentFirstIterator it(getRoot());
00974 return it;
00975 }
00976
00982 ParentLastIterator getParentLastIterator() const
00983 {
00984 ParentLastIterator it(getRoot());
00985 return it;
00986 }
00987
00988
00989
00990
00991
00993
00994 AccessClass operator[](const KeyType& k)
00995 {
00996 return AccessClass(*this, k);
00997 }
00998 private:
00999
01000
01001
01002
01003
01004
01005
01006 explicit map(const map& src);
01007 map& operator = (const map& src);
01008
01010
01014 void setRoot(Node* newRoot)
01015 {
01016 Root = newRoot;
01017 if (Root != 0)
01018 {
01019 Root->setParent(0);
01020 Root->setBlack();
01021 }
01022 }
01023
01025
01026 bool insert(Node* newNode)
01027 {
01028 bool result=true;
01029
01030 if (Root==0)
01031 {
01032 setRoot(newNode);
01033 Size = 1;
01034 }
01035 else
01036 {
01037 Node* pNode = Root;
01038 const KeyType& keyNew = newNode->getKey();
01039 while (pNode)
01040 {
01041 const KeyType& key=pNode->getKey();
01042
01043 if (keyNew == key)
01044 {
01045 result = false;
01046 pNode = 0;
01047 }
01048 else if (keyNew < key)
01049 {
01050 if (pNode->getLeftChild() == 0)
01051 {
01052 pNode->setLeftChild(newNode);
01053 pNode = 0;
01054 }
01055 else
01056 pNode = pNode->getLeftChild();
01057 }
01058 else
01059 {
01060 if (pNode->getRightChild()==0)
01061 {
01062 pNode->setRightChild(newNode);
01063 pNode = 0;
01064 }
01065 else
01066 {
01067 pNode = pNode->getRightChild();
01068 }
01069 }
01070 }
01071
01072 if (result)
01073 ++Size;
01074 }
01075
01076 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
01077 return result;
01078 }
01079
01082 void rotateLeft(Node* p)
01083 {
01084 Node* right = p->getRightChild();
01085
01086 p->setRightChild(right->getLeftChild());
01087
01088 if (p->isLeftChild())
01089 p->getParent()->setLeftChild(right);
01090 else if (p->isRightChild())
01091 p->getParent()->setRightChild(right);
01092 else
01093 setRoot(right);
01094
01095 right->setLeftChild(p);
01096 }
01097
01100 void rotateRight(Node* p)
01101 {
01102 Node* left = p->getLeftChild();
01103
01104 p->setLeftChild(left->getRightChild());
01105
01106 if (p->isLeftChild())
01107 p->getParent()->setLeftChild(left);
01108 else if (p->isRightChild())
01109 p->getParent()->setRightChild(left);
01110 else
01111 setRoot(left);
01112
01113 left->setRightChild(p);
01114 }
01115
01116
01117
01118
01119 Node* Root;
01120 u32 Size;
01121 };
01122
01123 }
01124 }
01125
01126 #endif // __IRR_MAP_H_INCLUDED__
01127