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/doc/html/irr_map_8h_source.html | 1188 -------------------- 1 file changed, 1188 deletions(-) delete mode 100644 libraries/irrlicht-1.8/doc/html/irr_map_8h_source.html (limited to 'libraries/irrlicht-1.8/doc/html/irr_map_8h_source.html') diff --git a/libraries/irrlicht-1.8/doc/html/irr_map_8h_source.html b/libraries/irrlicht-1.8/doc/html/irr_map_8h_source.html deleted file mode 100644 index 61e1a45..0000000 --- a/libraries/irrlicht-1.8/doc/html/irr_map_8h_source.html +++ /dev/null @@ -1,1188 +0,0 @@ - - -
- -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 -