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 @@ + + + + +Irrlicht 3D Engine: irrMap.h Source File + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + +
+
Irrlicht 3D Engine + +
+ +
+ + + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+
+
+
irrMap.h
+
+
+Go to the documentation of this file.
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 
+
+
+ + + + + -- cgit v1.1