From f9158592e1478b2013afc7041d9ed041cf2d2f4a Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Mon, 13 Jan 2014 19:47:58 +1000 Subject: Update Irrlicht to 1.8.1. Include actual change markers this time. lol --- .../irrlicht-1.8.1/doc/html/irr_map_8h_source.html | 1188 ++++++++++++++++++++ 1 file changed, 1188 insertions(+) create mode 100644 libraries/irrlicht-1.8.1/doc/html/irr_map_8h_source.html (limited to 'libraries/irrlicht-1.8.1/doc/html/irr_map_8h_source.html') diff --git a/libraries/irrlicht-1.8.1/doc/html/irr_map_8h_source.html b/libraries/irrlicht-1.8.1/doc/html/irr_map_8h_source.html new file mode 100644 index 0000000..bf083f2 --- /dev/null +++ b/libraries/irrlicht-1.8.1/doc/html/irr_map_8h_source.html @@ -0,0 +1,1188 @@ + + +
+ +00001 // Copyright (C) 2006-2012 by Kat'Oun +00002 // This file is part of the "Irrlicht Engine". +00003 // For conditions of distribution and use, see copyright notice in irrlicht.h +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 }; // RBTree +00131 +00132 public: +00133 +00134 typedef RBTree<KeyType,ValueType> Node; +00135 // We need the forwad declaration for the friend declaration +00136 class ConstIterator; +00137 +00139 class Iterator +00140 { +00141 friend class ConstIterator; +00142 public: +00143 +00144 Iterator() : Root(0), Cur(0) {} +00145 +00146 // Constructor(Node*) +00147 Iterator(Node* root) : Root(root) +00148 { +00149 reset(); +00150 } +00151 +00152 // Copy constructor +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()) // access violation +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 // Already at end? +00222 if (Cur==0) +00223 return; +00224 +00225 if (Cur->getRightChild()) +00226 { +00227 // If current node has a right child, the next higher node is the +00228 // node with lowest key beneath the right child. +00229 Cur = getMin(Cur->getRightChild()); +00230 } +00231 else if (Cur->isLeftChild()) +00232 { +00233 // No right child? Well if current node is a left child then +00234 // the next higher node is the parent +00235 Cur = Cur->getParent(); +00236 } +00237 else +00238 { +00239 // Current node neither is left child nor has a right child. +00240 // Ie it is either right child or root +00241 // The next higher node is the parent of the first non-right +00242 // child (ie either a left child or the root) up in the +00243 // hierarchy. Root's parent is 0. +00244 while(Cur->isRightChild()) +00245 Cur = Cur->getParent(); +00246 Cur = Cur->getParent(); +00247 } +00248 } +00249 +00250 void dec() +00251 { +00252 // Already at end? +00253 if (Cur==0) +00254 return; +00255 +00256 if (Cur->getLeftChild()) +00257 { +00258 // If current node has a left child, the next lower node is the +00259 // node with highest key beneath the left child. +00260 Cur = getMax(Cur->getLeftChild()); +00261 } +00262 else if (Cur->isRightChild()) +00263 { +00264 // No left child? Well if current node is a right child then +00265 // the next lower node is the parent +00266 Cur = Cur->getParent(); +00267 } +00268 else +00269 { +00270 // Current node neither is right child nor has a left child. +00271 // Ie it is either left child or root +00272 // The next higher node is the parent of the first non-left +00273 // child (ie either a right child or the root) up in the +00274 // hierarchy. Root's parent is 0. +00275 +00276 while(Cur->isLeftChild()) +00277 Cur = Cur->getParent(); +00278 Cur = Cur->getParent(); +00279 } +00280 } +00281 +00282 Node* Root; +00283 Node* Cur; +00284 }; // Iterator +00285 +00287 class ConstIterator +00288 { +00289 friend class Iterator; +00290 public: +00291 +00292 ConstIterator() : Root(0), Cur(0) {} +00293 +00294 // Constructor(Node*) +00295 ConstIterator(const Node* root) : Root(root) +00296 { +00297 reset(); +00298 } +00299 +00300 // Copy constructor +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()) // access violation +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 // Already at end? +00371 if (Cur==0) +00372 return; +00373 +00374 if (Cur->getRightChild()) +00375 { +00376 // If current node has a right child, the next higher node is the +00377 // node with lowest key beneath the right child. +00378 Cur = getMin(Cur->getRightChild()); +00379 } +00380 else if (Cur->isLeftChild()) +00381 { +00382 // No right child? Well if current node is a left child then +00383 // the next higher node is the parent +00384 Cur = Cur->getParent(); +00385 } +00386 else +00387 { +00388 // Current node neither is left child nor has a right child. +00389 // Ie it is either right child or root +00390 // The next higher node is the parent of the first non-right +00391 // child (ie either a left child or the root) up in the +00392 // hierarchy. Root's parent is 0. +00393 while(Cur->isRightChild()) +00394 Cur = Cur->getParent(); +00395 Cur = Cur->getParent(); +00396 } +00397 } +00398 +00399 void dec() +00400 { +00401 // Already at end? +00402 if (Cur==0) +00403 return; +00404 +00405 if (Cur->getLeftChild()) +00406 { +00407 // If current node has a left child, the next lower node is the +00408 // node with highest key beneath the left child. +00409 Cur = getMax(Cur->getLeftChild()); +00410 } +00411 else if (Cur->isRightChild()) +00412 { +00413 // No left child? Well if current node is a right child then +00414 // the next lower node is the parent +00415 Cur = Cur->getParent(); +00416 } +00417 else +00418 { +00419 // Current node neither is right child nor has a left child. +00420 // Ie it is either left child or root +00421 // The next higher node is the parent of the first non-left +00422 // child (ie either a right child or the root) up in the +00423 // hierarchy. Root's parent is 0. +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 }; // ConstIterator +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()) // access violation +00488 +00489 return *getNode(); +00490 } +00491 +00492 private: +00493 +00494 void inc() +00495 { +00496 // Already at end? +00497 if (Cur==0) +00498 return; +00499 +00500 // First we try down to the left +00501 if (Cur->getLeftChild()) +00502 { +00503 Cur = Cur->getLeftChild(); +00504 } +00505 else if (Cur->getRightChild()) +00506 { +00507 // No left child? The we go down to the right. +00508 Cur = Cur->getRightChild(); +00509 } +00510 else +00511 { +00512 // No children? Move up in the hierarcy until +00513 // we either reach 0 (and are finished) or +00514 // find a right uncle. +00515 while (Cur!=0) +00516 { +00517 // But if parent is left child and has a right "uncle" the parent +00518 // has already been processed but the uncle hasn't. Move to +00519 // the uncle. +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 }; // ParentFirstIterator +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()) // access violation +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 // Already at end? +00608 if (Cur==0) +00609 return; +00610 +00611 // Note: Starting point is the node as far down to the left as possible. +00612 +00613 // If current node has an uncle to the right, go to the +00614 // node as far down to the left from the uncle as possible +00615 // else just go up a level to the parent. +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 }; // ParentLastIterator +00627 +00628 +00629 // AccessClass is a temporary class used with the [] operator. +00630 // It makes it possible to have different behavior in situations like: +00631 // myTree["Foo"] = 32; +00632 // If "Foo" already exists update its value else insert a new element. +00633 // int i = myTree["Foo"] +00634 // If "Foo" exists return its value. +00635 class AccessClass +00636 { +00637 // Let map be the only one who can instantiate this class. +00638 friend class map<KeyType, ValueType>; +00639 +00640 public: +00641 +00642 // Assignment operator. Handles the myTree["Foo"] = 32; situation +00643 void operator=(const ValueType& value) +00644 { +00645 // Just use the Set method, it handles already exist/not exist situation +00646 Tree.set(Key,value); +00647 } +00648 +00649 // ValueType operator +00650 operator ValueType() +00651 { +00652 Node* node = Tree.find(Key); +00653 +00654 // Not found +00655 _IRR_DEBUG_BREAK_IF(node==0) // access violation +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 }; // AccessClass +00670 +00671 +00672 // Constructor. +00673 map() : Root(0), Size(0) {} +00674 +00675 // Destructor +00676 ~map() +00677 { +00678 clear(); +00679 } +00680 +00681 //------------------------------ +00682 // Public Commands +00683 //------------------------------ +00684 +00686 +00689 bool insert(const KeyType& keyNew, const ValueType& v) +00690 { +00691 // First insert node the "usual" way (no fancy balance logic yet) +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 // Then attend a balancing party +00701 while (!newNode->isRoot() && (newNode->getParent()->isRed())) +00702 { +00703 if (newNode->getParent()->isLeftChild()) +00704 { +00705 // If newNode is a left child, get its right 'uncle' +00706 Node* newNodesUncle = newNode->getParent()->getParent()->getRightChild(); +00707 if ( newNodesUncle!=0 && newNodesUncle->isRed()) +00708 { +00709 // case 1 - change the colors +00710 newNode->getParent()->setBlack(); +00711 newNodesUncle->setBlack(); +00712 newNode->getParent()->getParent()->setRed(); +00713 // Move newNode up the tree +00714 newNode = newNode->getParent()->getParent(); +00715 } +00716 else +00717 { +00718 // newNodesUncle is a black node +00719 if ( newNode->isRightChild()) +00720 { +00721 // and newNode is to the right +00722 // case 2 - move newNode up and rotate +00723 newNode = newNode->getParent(); +00724 rotateLeft(newNode); +00725 } +00726 // case 3 +00727 newNode->getParent()->setBlack(); +00728 newNode->getParent()->getParent()->setRed(); +00729 rotateRight(newNode->getParent()->getParent()); +00730 } +00731 } +00732 else +00733 { +00734 // If newNode is a right child, get its left 'uncle' +00735 Node* newNodesUncle = newNode->getParent()->getParent()->getLeftChild(); +00736 if ( newNodesUncle!=0 && newNodesUncle->isRed()) +00737 { +00738 // case 1 - change the colors +00739 newNode->getParent()->setBlack(); +00740 newNodesUncle->setBlack(); +00741 newNode->getParent()->getParent()->setRed(); +00742 // Move newNode up the tree +00743 newNode = newNode->getParent()->getParent(); +00744 } +00745 else +00746 { +00747 // newNodesUncle is a black node +00748 if (newNode->isLeftChild()) +00749 { +00750 // and newNode is to the left +00751 // case 2 - move newNode up and rotate +00752 newNode = newNode->getParent(); +00753 rotateRight(newNode); +00754 } +00755 // case 3 +00756 newNode->getParent()->setBlack(); +00757 newNode->getParent()->getParent()->setRed(); +00758 rotateLeft(newNode->getParent()->getParent()); +00759 } +00760 +00761 } +00762 } +00763 // Color the root black +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 // Rotate p down to the left until it has no right child, will get there +00791 // sooner or later. +00792 while(p->getRightChild()) +00793 { +00794 // "Pull up my right child and let it knock me down to the left" +00795 rotateLeft(p); +00796 } +00797 // p now has no right child but might have a left child +00798 Node* left = p->getLeftChild(); +00799 +00800 // Let p's parent point to p's child instead of point to p +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 // p has no parent => p is the root. +00810 // Let the left child be the new root. +00811 setRoot(left); +00812 } +00813 +00814 // p is now gone from the tree in the sense that +00815 // no one is pointing at it, so return it. +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 // Rotate p down to the left until it has no right child, will get there +00840 // sooner or later. +00841 while(p->getRightChild()) +00842 { +00843 // "Pull up my right child and let it knock me down to the left" +00844 rotateLeft(p); +00845 } +00846 // p now has no right child but might have a left child +00847 Node* left = p->getLeftChild(); +00848 +00849 // Let p's parent point to p's child instead of point to p +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 // p has no parent => p is the root. +00859 // Let the left child be the new root. +00860 setRoot(left); +00861 } +00862 +00863 // p is now gone from the tree in the sense that +00864 // no one is pointing at it. Let's get rid of it. +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++; // Increment it before it is deleted +00880 // else iterator will get quite confused. +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 //keyToFind > key +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 // Public Iterators +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 // Public Operators +00990 //------------------------------ +00991 +00993 +00994 AccessClass operator[](const KeyType& k) +00995 { +00996 return AccessClass(*this, k); +00997 } +00998 private: +00999 +01000 //------------------------------ +01001 // Disabled methods +01002 //------------------------------ +01003 // Copy constructor and assignment operator deliberately +01004 // defined but not implemented. The tree should never be +01005 // copied, pass along references to it instead. +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; // Assume success +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 // keyNew > key +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 // Private Members +01118 //------------------------------ +01119 Node* Root; // The top node. 0 if empty. +01120 u32 Size; // Number of nodes in the tree +01121 }; +01122 +01123 } // end namespace core +01124 } // end namespace irr +01125 +01126 #endif // __IRR_MAP_H_INCLUDED__ +01127 +