LCOV - code coverage report
Current view: top level - usr/include/irrlicht - irrMap.h (source / functions) Hit Total Coverage
Test: report Lines: 0 166 0.0 %
Date: 2015-07-11 18:23:49 Functions: 0 99 0.0 %

          Line data    Source code
       1             : // Copyright (C) 2006-2012 by Kat'Oun
       2             : // This file is part of the "Irrlicht Engine".
       3             : // For conditions of distribution and use, see copyright notice in irrlicht.h
       4             : 
       5             : #ifndef __IRR_MAP_H_INCLUDED__
       6             : #define __IRR_MAP_H_INCLUDED__
       7             : 
       8             : #include "irrTypes.h"
       9             : #include "irrMath.h"
      10             : 
      11             : namespace irr
      12             : {
      13             : namespace core
      14             : {
      15             : 
      16             : //! map template for associative arrays using a red-black tree
      17             : template <class KeyType, class ValueType>
      18             : class map
      19             : {
      20             :         //! red/black tree for map
      21             :         template <class KeyTypeRB, class ValueTypeRB>
      22             :         class RBTree
      23             :         {
      24             :         public:
      25             : 
      26           0 :                 RBTree(const KeyTypeRB& k, const ValueTypeRB& v)
      27             :                         : LeftChild(0), RightChild(0), Parent(0), Key(k),
      28           0 :                                 Value(v), IsRed(true) {}
      29             : 
      30           0 :                 void setLeftChild(RBTree* p)
      31             :                 {
      32           0 :                         LeftChild=p;
      33           0 :                         if (p)
      34           0 :                                 p->setParent(this);
      35           0 :                 }
      36             : 
      37           0 :                 void setRightChild(RBTree* p)
      38             :                 {
      39           0 :                         RightChild=p;
      40           0 :                         if (p)
      41           0 :                                 p->setParent(this);
      42           0 :                 }
      43             : 
      44           0 :                 void setParent(RBTree* p)               { Parent=p; }
      45             : 
      46             :                 void setValue(const ValueTypeRB& v) { Value = v; }
      47             : 
      48           0 :                 void setRed()                   { IsRed = true; }
      49           0 :                 void setBlack()                 { IsRed = false; }
      50             : 
      51           0 :                 RBTree* getLeftChild() const    { return LeftChild; }
      52           0 :                 RBTree* getRightChild() const   { return RightChild; }
      53           0 :                 RBTree* getParent() const               { return Parent; }
      54             : 
      55             :                 const ValueTypeRB& getValue() const
      56             :                 {
      57             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      58             :                         return Value;
      59             :                 }
      60             : 
      61           0 :                 ValueTypeRB& getValue()
      62             :                 {
      63             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      64           0 :                         return Value;
      65             :                 }
      66             : 
      67           0 :                 const KeyTypeRB& getKey() const
      68             :                 {
      69             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      70           0 :                         return Key;
      71             :                 }
      72             : 
      73           0 :                 bool isRoot() const
      74             :                 {
      75             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      76           0 :                         return Parent==0;
      77             :                 }
      78             : 
      79           0 :                 bool isLeftChild() const
      80             :                 {
      81             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      82           0 :                         return (Parent != 0) && (Parent->getLeftChild()==this);
      83             :                 }
      84             : 
      85           0 :                 bool isRightChild() const
      86             :                 {
      87             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      88           0 :                         return (Parent!=0) && (Parent->getRightChild()==this);
      89             :                 }
      90             : 
      91             :                 bool isLeaf() const
      92             :                 {
      93             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
      94             :                         return (LeftChild==0) && (RightChild==0);
      95             :                 }
      96             : 
      97             :                 unsigned int getLevel() const
      98             :                 {
      99             :                         if (isRoot())
     100             :                                 return 1;
     101             :                         else
     102             :                                 return getParent()->getLevel() + 1;
     103             :                 }
     104             : 
     105             : 
     106           0 :                 bool isRed() const
     107             :                 {
     108             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     109           0 :                         return IsRed;
     110             :                 }
     111             : 
     112             :                 bool isBlack() const
     113             :                 {
     114             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     115             :                         return !IsRed;
     116             :                 }
     117             : 
     118             :         private:
     119             :                 RBTree();
     120             : 
     121             :                 RBTree*         LeftChild;
     122             :                 RBTree*         RightChild;
     123             : 
     124             :                 RBTree*         Parent;
     125             : 
     126             :                 KeyTypeRB       Key;
     127             :                 ValueTypeRB     Value;
     128             : 
     129             :                 bool IsRed;
     130             :         }; // RBTree
     131             : 
     132             :         public:
     133             : 
     134             :         typedef RBTree<KeyType,ValueType> Node;
     135             :         // We need the forwad declaration for the friend declaration
     136             :         class ConstIterator;
     137             : 
     138             :         //! Normal Iterator
     139             :         class Iterator
     140             :         {
     141             :                 friend class ConstIterator;
     142             :         public:
     143             : 
     144             :                 Iterator() : Root(0), Cur(0) {}
     145             : 
     146             :                 // Constructor(Node*)
     147             :                 Iterator(Node* root) : Root(root)
     148             :                 {
     149             :                         reset();
     150             :                 }
     151             : 
     152             :                 // Copy constructor
     153             :                 Iterator(const Iterator& src) : Root(src.Root), Cur(src.Cur) {}
     154             : 
     155             :                 void reset(bool atLowest=true)
     156             :                 {
     157             :                         if (atLowest)
     158             :                                 Cur = getMin(Root);
     159             :                         else
     160             :                                 Cur = getMax(Root);
     161             :                 }
     162             : 
     163             :                 bool atEnd() const
     164             :                 {
     165             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     166             :                         return Cur==0;
     167             :                 }
     168             : 
     169             :                 Node* getNode() const
     170             :                 {
     171             :                         return Cur;
     172             :                 }
     173             : 
     174             :                 Iterator& operator=(const Iterator& src)
     175             :                 {
     176             :                         Root = src.Root;
     177             :                         Cur = src.Cur;
     178             :                         return (*this);
     179             :                 }
     180             : 
     181             :                 void operator++(int)
     182             :                 {
     183             :                         inc();
     184             :                 }
     185             : 
     186             :                 void operator--(int)
     187             :                 {
     188             :                         dec();
     189             :                 }
     190             : 
     191             :                 Node* operator->()
     192             :                 {
     193             :                         return getNode();
     194             :                 }
     195             : 
     196             :                 Node& operator*()
     197             :                 {
     198             :                         _IRR_DEBUG_BREAK_IF(atEnd()) // access violation
     199             : 
     200             :                         return *Cur;
     201             :                 }
     202             : 
     203             :         private:
     204             : 
     205             :                 Node* getMin(Node* n) const
     206             :                 {
     207             :                         while(n && n->getLeftChild())
     208             :                                 n = n->getLeftChild();
     209             :                         return n;
     210             :                 }
     211             : 
     212             :                 Node* getMax(Node* n) const
     213             :                 {
     214             :                         while(n && n->getRightChild())
     215             :                                 n = n->getRightChild();
     216             :                         return n;
     217             :                 }
     218             : 
     219             :                 void inc()
     220             :                 {
     221             :                         // Already at end?
     222             :                         if (Cur==0)
     223             :                                 return;
     224             : 
     225             :                         if (Cur->getRightChild())
     226             :                         {
     227             :                                 // If current node has a right child, the next higher node is the
     228             :                                 // node with lowest key beneath the right child.
     229             :                                 Cur = getMin(Cur->getRightChild());
     230             :                         }
     231             :                         else if (Cur->isLeftChild())
     232             :                         {
     233             :                                 // No right child? Well if current node is a left child then
     234             :                                 // the next higher node is the parent
     235             :                                 Cur = Cur->getParent();
     236             :                         }
     237             :                         else
     238             :                         {
     239             :                                 // Current node neither is left child nor has a right child.
     240             :                                 // Ie it is either right child or root
     241             :                                 // The next higher node is the parent of the first non-right
     242             :                                 // child (ie either a left child or the root) up in the
     243             :                                 // hierarchy. Root's parent is 0.
     244             :                                 while(Cur->isRightChild())
     245             :                                         Cur = Cur->getParent();
     246             :                                 Cur = Cur->getParent();
     247             :                         }
     248             :                 }
     249             : 
     250             :                 void dec()
     251             :                 {
     252             :                         // Already at end?
     253             :                         if (Cur==0)
     254             :                                 return;
     255             : 
     256             :                         if (Cur->getLeftChild())
     257             :                         {
     258             :                                 // If current node has a left child, the next lower node is the
     259             :                                 // node with highest key beneath the left child.
     260             :                                 Cur = getMax(Cur->getLeftChild());
     261             :                         }
     262             :                         else if (Cur->isRightChild())
     263             :                         {
     264             :                                 // No left child? Well if current node is a right child then
     265             :                                 // the next lower node is the parent
     266             :                                 Cur = Cur->getParent();
     267             :                         }
     268             :                         else
     269             :                         {
     270             :                                 // Current node neither is right child nor has a left child.
     271             :                                 // Ie it is either left child or root
     272             :                                 // The next higher node is the parent of the first non-left
     273             :                                 // child (ie either a right child or the root) up in the
     274             :                                 // hierarchy. Root's parent is 0.
     275             : 
     276             :                                 while(Cur->isLeftChild())
     277             :                                         Cur = Cur->getParent();
     278             :                                 Cur = Cur->getParent();
     279             :                         }
     280             :                 }
     281             : 
     282             :                 Node* Root;
     283             :                 Node* Cur;
     284             :         }; // Iterator
     285             : 
     286             :         //! Const Iterator
     287             :         class ConstIterator
     288             :         {
     289             :                 friend class Iterator;
     290             :         public:
     291             : 
     292             :                 ConstIterator() : Root(0), Cur(0) {}
     293             : 
     294             :                 // Constructor(Node*)
     295             :                 ConstIterator(const Node* root) : Root(root)
     296             :                 {
     297             :                         reset();
     298             :                 }
     299             : 
     300             :                 // Copy constructor
     301             :                 ConstIterator(const ConstIterator& src) : Root(src.Root), Cur(src.Cur) {}
     302             :                 ConstIterator(const Iterator& src) : Root(src.Root), Cur(src.Cur) {}
     303             : 
     304             :                 void reset(bool atLowest=true)
     305             :                 {
     306             :                         if (atLowest)
     307             :                                 Cur = getMin(Root);
     308             :                         else
     309             :                                 Cur = getMax(Root);
     310             :                 }
     311             : 
     312             :                 bool atEnd() const
     313             :                 {
     314             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     315             :                         return Cur==0;
     316             :                 }
     317             : 
     318             :                 const Node* getNode() const
     319             :                 {
     320             :                         return Cur;
     321             :                 }
     322             : 
     323             :                 ConstIterator& operator=(const ConstIterator& src)
     324             :                 {
     325             :                         Root = src.Root;
     326             :                         Cur = src.Cur;
     327             :                         return (*this);
     328             :                 }
     329             : 
     330             :                 void operator++(int)
     331             :                 {
     332             :                         inc();
     333             :                 }
     334             : 
     335             :                 void operator--(int)
     336             :                 {
     337             :                         dec();
     338             :                 }
     339             : 
     340             :                 const Node* operator->()
     341             :                 {
     342             :                         return getNode();
     343             :                 }
     344             : 
     345             :                 const Node& operator*()
     346             :                 {
     347             :                         _IRR_DEBUG_BREAK_IF(atEnd()) // access violation
     348             : 
     349             :                         return *Cur;
     350             :                 }
     351             : 
     352             :         private:
     353             : 
     354             :                 const Node* getMin(const Node* n) const
     355             :                 {
     356             :                         while(n && n->getLeftChild())
     357             :                                 n = n->getLeftChild();
     358             :                         return n;
     359             :                 }
     360             : 
     361             :                 const Node* getMax(const Node* n) const
     362             :                 {
     363             :                         while(n && n->getRightChild())
     364             :                                 n = n->getRightChild();
     365             :                         return n;
     366             :                 }
     367             : 
     368             :                 void inc()
     369             :                 {
     370             :                         // Already at end?
     371             :                         if (Cur==0)
     372             :                                 return;
     373             : 
     374             :                         if (Cur->getRightChild())
     375             :                         {
     376             :                                 // If current node has a right child, the next higher node is the
     377             :                                 // node with lowest key beneath the right child.
     378             :                                 Cur = getMin(Cur->getRightChild());
     379             :                         }
     380             :                         else if (Cur->isLeftChild())
     381             :                         {
     382             :                                 // No right child? Well if current node is a left child then
     383             :                                 // the next higher node is the parent
     384             :                                 Cur = Cur->getParent();
     385             :                         }
     386             :                         else
     387             :                         {
     388             :                                 // Current node neither is left child nor has a right child.
     389             :                                 // Ie it is either right child or root
     390             :                                 // The next higher node is the parent of the first non-right
     391             :                                 // child (ie either a left child or the root) up in the
     392             :                                 // hierarchy. Root's parent is 0.
     393             :                                 while(Cur->isRightChild())
     394             :                                         Cur = Cur->getParent();
     395             :                                 Cur = Cur->getParent();
     396             :                         }
     397             :                 }
     398             : 
     399             :                 void dec()
     400             :                 {
     401             :                         // Already at end?
     402             :                         if (Cur==0)
     403             :                                 return;
     404             : 
     405             :                         if (Cur->getLeftChild())
     406             :                         {
     407             :                                 // If current node has a left child, the next lower node is the
     408             :                                 // node with highest key beneath the left child.
     409             :                                 Cur = getMax(Cur->getLeftChild());
     410             :                         }
     411             :                         else if (Cur->isRightChild())
     412             :                         {
     413             :                                 // No left child? Well if current node is a right child then
     414             :                                 // the next lower node is the parent
     415             :                                 Cur = Cur->getParent();
     416             :                         }
     417             :                         else
     418             :                         {
     419             :                                 // Current node neither is right child nor has a left child.
     420             :                                 // Ie it is either left child or root
     421             :                                 // The next higher node is the parent of the first non-left
     422             :                                 // child (ie either a right child or the root) up in the
     423             :                                 // hierarchy. Root's parent is 0.
     424             : 
     425             :                                 while(Cur->isLeftChild())
     426             :                                         Cur = Cur->getParent();
     427             :                                 Cur = Cur->getParent();
     428             :                         }
     429             :                 }
     430             : 
     431             :                 const Node* Root;
     432             :                 const Node* Cur;
     433             :         }; // ConstIterator
     434             : 
     435             : 
     436             :         //! Parent First Iterator.
     437             :         /** Traverses the tree from top to bottom. Typical usage is
     438             :         when storing the tree structure, because when reading it
     439             :         later (and inserting elements) the tree structure will
     440             :         be the same. */
     441             :         class ParentFirstIterator
     442             :         {
     443             :         public:
     444             : 
     445             :         ParentFirstIterator() : Root(0), Cur(0) {}
     446             : 
     447             :         explicit ParentFirstIterator(Node* root) : Root(root), Cur(0)
     448             :         {
     449             :                 reset();
     450             :         }
     451             : 
     452             :         void reset()
     453             :         {
     454             :                 Cur = Root;
     455             :         }
     456             : 
     457             :         bool atEnd() const
     458             :         {
     459             :                 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     460             :                 return Cur==0;
     461             :         }
     462             : 
     463             :         Node* getNode()
     464             :         {
     465             :                 return Cur;
     466             :         }
     467             : 
     468             :         ParentFirstIterator& operator=(const ParentFirstIterator& src)
     469             :         {
     470             :                 Root = src.Root;
     471             :                 Cur = src.Cur;
     472             :                 return (*this);
     473             :         }
     474             : 
     475             :         void operator++(int)
     476             :         {
     477             :                 inc();
     478             :         }
     479             : 
     480             :         Node* operator -> ()
     481             :         {
     482             :                 return getNode();
     483             :         }
     484             : 
     485             :         Node& operator* ()
     486             :         {
     487             :                 _IRR_DEBUG_BREAK_IF(atEnd()) // access violation
     488             : 
     489             :                 return *getNode();
     490             :         }
     491             : 
     492             :         private:
     493             : 
     494             :         void inc()
     495             :         {
     496             :                 // Already at end?
     497             :                 if (Cur==0)
     498             :                         return;
     499             : 
     500             :                 // First we try down to the left
     501             :                 if (Cur->getLeftChild())
     502             :                 {
     503             :                         Cur = Cur->getLeftChild();
     504             :                 }
     505             :                 else if (Cur->getRightChild())
     506             :                 {
     507             :                         // No left child? The we go down to the right.
     508             :                         Cur = Cur->getRightChild();
     509             :                 }
     510             :                 else
     511             :                 {
     512             :                         // No children? Move up in the hierarcy until
     513             :                         // we either reach 0 (and are finished) or
     514             :                         // find a right uncle.
     515             :                         while (Cur!=0)
     516             :                         {
     517             :                                 // But if parent is left child and has a right "uncle" the parent
     518             :                                 // has already been processed but the uncle hasn't. Move to
     519             :                                 // the uncle.
     520             :                                 if (Cur->isLeftChild() && Cur->getParent()->getRightChild())
     521             :                                 {
     522             :                                         Cur = Cur->getParent()->getRightChild();
     523             :                                         return;
     524             :                                 }
     525             :                                 Cur = Cur->getParent();
     526             :                         }
     527             :                 }
     528             :         }
     529             : 
     530             :         Node* Root;
     531             :         Node* Cur;
     532             : 
     533             :         }; // ParentFirstIterator
     534             : 
     535             : 
     536             :         //! Parent Last Iterator
     537             :         /** Traverse the tree from bottom to top.
     538             :         Typical usage is when deleting all elements in the tree
     539             :         because you must delete the children before you delete
     540             :         their parent. */
     541             :         class ParentLastIterator
     542             :         {
     543             :         public:
     544             : 
     545             :                 ParentLastIterator() : Root(0), Cur(0) {}
     546             : 
     547           0 :                 explicit ParentLastIterator(Node* root) : Root(root), Cur(0)
     548             :                 {
     549           0 :                         reset();
     550           0 :                 }
     551             : 
     552           0 :                 void reset()
     553             :                 {
     554           0 :                         Cur = getMin(Root);
     555           0 :                 }
     556             : 
     557           0 :                 bool atEnd() const
     558             :                 {
     559             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     560           0 :                         return Cur==0;
     561             :                 }
     562             : 
     563           0 :                 Node* getNode()
     564             :                 {
     565           0 :                         return Cur;
     566             :                 }
     567             : 
     568             :                 ParentLastIterator& operator=(const ParentLastIterator& src)
     569             :                 {
     570             :                         Root = src.Root;
     571             :                         Cur = src.Cur;
     572             :                         return (*this);
     573             :                 }
     574             : 
     575           0 :                 void operator++(int)
     576             :                 {
     577           0 :                         inc();
     578           0 :                 }
     579             : 
     580             :                 Node* operator -> ()
     581             :                 {
     582             :                         return getNode();
     583             :                 }
     584             : 
     585             :                 Node& operator* ()
     586             :                 {
     587             :                         _IRR_DEBUG_BREAK_IF(atEnd()) // access violation
     588             : 
     589             :                         return *getNode();
     590             :                 }
     591             :         private:
     592             : 
     593           0 :                 Node* getMin(Node* n)
     594             :                 {
     595           0 :                         while(n!=0 && (n->getLeftChild()!=0 || n->getRightChild()!=0))
     596             :                         {
     597           0 :                                 if (n->getLeftChild())
     598           0 :                                         n = n->getLeftChild();
     599             :                                 else
     600           0 :                                         n = n->getRightChild();
     601             :                         }
     602           0 :                         return n;
     603             :                 }
     604             : 
     605           0 :                 void inc()
     606             :                 {
     607             :                         // Already at end?
     608           0 :                         if (Cur==0)
     609           0 :                                 return;
     610             : 
     611             :                         // Note: Starting point is the node as far down to the left as possible.
     612             : 
     613             :                         // If current node has an uncle to the right, go to the
     614             :                         // node as far down to the left from the uncle as possible
     615             :                         // else just go up a level to the parent.
     616           0 :                         if (Cur->isLeftChild() && Cur->getParent()->getRightChild())
     617             :                         {
     618           0 :                                 Cur = getMin(Cur->getParent()->getRightChild());
     619             :                         }
     620             :                         else
     621           0 :                                 Cur = Cur->getParent();
     622             :                 }
     623             : 
     624             :                 Node* Root;
     625             :                 Node* Cur;
     626             :         }; // ParentLastIterator
     627             : 
     628             : 
     629             :         // AccessClass is a temporary class used with the [] operator.
     630             :         // It makes it possible to have different behavior in situations like:
     631             :         // myTree["Foo"] = 32;
     632             :         // If "Foo" already exists update its value else insert a new element.
     633             :         // int i = myTree["Foo"]
     634             :         // If "Foo" exists return its value.
     635             :         class AccessClass
     636             :         {
     637             :                 // Let map be the only one who can instantiate this class.
     638             :                 friend class map<KeyType, ValueType>;
     639             : 
     640             :         public:
     641             : 
     642             :                 // Assignment operator. Handles the myTree["Foo"] = 32; situation
     643             :                 void operator=(const ValueType& value)
     644             :                 {
     645             :                         // Just use the Set method, it handles already exist/not exist situation
     646             :                         Tree.set(Key,value);
     647             :                 }
     648             : 
     649             :                 // ValueType operator
     650             :                 operator ValueType()
     651             :                 {
     652             :                         Node* node = Tree.find(Key);
     653             : 
     654             :                         // Not found
     655             :                         _IRR_DEBUG_BREAK_IF(node==0) // access violation
     656             : 
     657             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     658             :                         return node->getValue();
     659             :                 }
     660             : 
     661             :         private:
     662             : 
     663             :                 AccessClass(map& tree, const KeyType& key) : Tree(tree), Key(key) {}
     664             : 
     665             :                 AccessClass();
     666             : 
     667             :                 map& Tree;
     668             :                 const KeyType& Key;
     669             :         }; // AccessClass
     670             : 
     671             : 
     672             :         // Constructor.
     673           0 :         map() : Root(0), Size(0) {}
     674             : 
     675             :         // Destructor
     676           0 :         ~map()
     677             :         {
     678           0 :                 clear();
     679           0 :         }
     680             : 
     681             :         //------------------------------
     682             :         // Public Commands
     683             :         //------------------------------
     684             : 
     685             :         //! Inserts a new node into the tree
     686             :         /** \param keyNew: the index for this value
     687             :         \param v: the value to insert
     688             :         \return True if successful, false if it fails (already exists) */
     689           0 :         bool insert(const KeyType& keyNew, const ValueType& v)
     690             :         {
     691             :                 // First insert node the "usual" way (no fancy balance logic yet)
     692           0 :                 Node* newNode = new Node(keyNew,v);
     693           0 :                 if (!insert(newNode))
     694             :                 {
     695           0 :                         delete newNode;
     696             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     697           0 :                         return false;
     698             :                 }
     699             : 
     700             :                 // Then attend a balancing party
     701           0 :                 while (!newNode->isRoot() && (newNode->getParent()->isRed()))
     702             :                 {
     703           0 :                         if (newNode->getParent()->isLeftChild())
     704             :                         {
     705             :                                 // If newNode is a left child, get its right 'uncle'
     706           0 :                                 Node* newNodesUncle = newNode->getParent()->getParent()->getRightChild();
     707           0 :                                 if ( newNodesUncle!=0 && newNodesUncle->isRed())
     708             :                                 {
     709             :                                         // case 1 - change the colors
     710           0 :                                         newNode->getParent()->setBlack();
     711           0 :                                         newNodesUncle->setBlack();
     712           0 :                                         newNode->getParent()->getParent()->setRed();
     713             :                                         // Move newNode up the tree
     714           0 :                                         newNode = newNode->getParent()->getParent();
     715             :                                 }
     716             :                                 else
     717             :                                 {
     718             :                                         // newNodesUncle is a black node
     719           0 :                                         if ( newNode->isRightChild())
     720             :                                         {
     721             :                                                 // and newNode is to the right
     722             :                                                 // case 2 - move newNode up and rotate
     723           0 :                                                 newNode = newNode->getParent();
     724           0 :                                                 rotateLeft(newNode);
     725             :                                         }
     726             :                                         // case 3
     727           0 :                                         newNode->getParent()->setBlack();
     728           0 :                                         newNode->getParent()->getParent()->setRed();
     729           0 :                                         rotateRight(newNode->getParent()->getParent());
     730             :                                 }
     731             :                         }
     732             :                         else
     733             :                         {
     734             :                                 // If newNode is a right child, get its left 'uncle'
     735           0 :                                 Node* newNodesUncle = newNode->getParent()->getParent()->getLeftChild();
     736           0 :                                 if ( newNodesUncle!=0 && newNodesUncle->isRed())
     737             :                                 {
     738             :                                         // case 1 - change the colors
     739           0 :                                         newNode->getParent()->setBlack();
     740           0 :                                         newNodesUncle->setBlack();
     741           0 :                                         newNode->getParent()->getParent()->setRed();
     742             :                                         // Move newNode up the tree
     743           0 :                                         newNode = newNode->getParent()->getParent();
     744             :                                 }
     745             :                                 else
     746             :                                 {
     747             :                                         // newNodesUncle is a black node
     748           0 :                                         if (newNode->isLeftChild())
     749             :                                         {
     750             :                                                 // and newNode is to the left
     751             :                                                 // case 2 - move newNode up and rotate
     752           0 :                                                 newNode = newNode->getParent();
     753           0 :                                                 rotateRight(newNode);
     754             :                                         }
     755             :                                         // case 3
     756           0 :                                         newNode->getParent()->setBlack();
     757           0 :                                         newNode->getParent()->getParent()->setRed();
     758           0 :                                         rotateLeft(newNode->getParent()->getParent());
     759             :                                 }
     760             : 
     761             :                         }
     762             :                 }
     763             :                 // Color the root black
     764           0 :                 Root->setBlack();
     765           0 :                 return true;
     766             :         }
     767             : 
     768             :         //! Replaces the value if the key already exists, otherwise inserts a new element.
     769             :         /** \param k The index for this value
     770             :         \param v The new value of */
     771             :         void set(const KeyType& k, const ValueType& v)
     772             :         {
     773             :                 Node* p = find(k);
     774             :                 if (p)
     775             :                         p->setValue(v);
     776             :                 else
     777             :                         insert(k,v);
     778             :         }
     779             : 
     780             :         //! Removes a node from the tree and returns it.
     781             :         /** The returned node must be deleted by the user
     782             :         \param k the key to remove
     783             :         \return A pointer to the node, or 0 if not found */
     784             :         Node* delink(const KeyType& k)
     785             :         {
     786             :                 Node* p = find(k);
     787             :                 if (p == 0)
     788             :                         return 0;
     789             : 
     790             :                 // Rotate p down to the left until it has no right child, will get there
     791             :                 // sooner or later.
     792             :                 while(p->getRightChild())
     793             :                 {
     794             :                         // "Pull up my right child and let it knock me down to the left"
     795             :                         rotateLeft(p);
     796             :                 }
     797             :                 // p now has no right child but might have a left child
     798             :                 Node* left = p->getLeftChild();
     799             : 
     800             :                 // Let p's parent point to p's child instead of point to p
     801             :                 if (p->isLeftChild())
     802             :                         p->getParent()->setLeftChild(left);
     803             : 
     804             :                 else if (p->isRightChild())
     805             :                         p->getParent()->setRightChild(left);
     806             : 
     807             :                 else
     808             :                 {
     809             :                         // p has no parent => p is the root.
     810             :                         // Let the left child be the new root.
     811             :                         setRoot(left);
     812             :                 }
     813             : 
     814             :                 // p is now gone from the tree in the sense that
     815             :                 // no one is pointing at it, so return it.
     816             : 
     817             :                 --Size;
     818             :                 return p;
     819             :         }
     820             : 
     821             :         //! Removes a node from the tree and deletes it.
     822             :         /** \return True if the node was found and deleted */
     823             :         bool remove(const KeyType& k)
     824             :         {
     825             :                 Node* p = find(k);
     826             :                 return remove(p);
     827             :         }
     828             : 
     829             :         //! Removes a node from the tree and deletes it.
     830             :         /** \return True if the node was found and deleted */
     831             :         bool remove(Node* p)
     832             :         {
     833             :                 if (p == 0)
     834             :                 {
     835             :                         _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     836             :                         return false;
     837             :                 }
     838             : 
     839             :                 // Rotate p down to the left until it has no right child, will get there
     840             :                 // sooner or later.
     841             :                 while(p->getRightChild())
     842             :                 {
     843             :                         // "Pull up my right child and let it knock me down to the left"
     844             :                         rotateLeft(p);
     845             :                 }
     846             :                 // p now has no right child but might have a left child
     847             :                 Node* left = p->getLeftChild();
     848             : 
     849             :                 // Let p's parent point to p's child instead of point to p
     850             :                 if (p->isLeftChild())
     851             :                         p->getParent()->setLeftChild(left);
     852             : 
     853             :                 else if (p->isRightChild())
     854             :                         p->getParent()->setRightChild(left);
     855             : 
     856             :                 else
     857             :                 {
     858             :                         // p has no parent => p is the root.
     859             :                         // Let the left child be the new root.
     860             :                         setRoot(left);
     861             :                 }
     862             : 
     863             :                 // p is now gone from the tree in the sense that
     864             :                 // no one is pointing at it. Let's get rid of it.
     865             :                 delete p;
     866             : 
     867             :                 --Size;
     868             :                 return true;
     869             :         }
     870             : 
     871             :         //! Clear the entire tree
     872           0 :         void clear()
     873             :         {
     874           0 :                 ParentLastIterator i(getParentLastIterator());
     875             : 
     876           0 :                 while(!i.atEnd())
     877             :                 {
     878           0 :                         Node* p = i.getNode();
     879           0 :                         i++; // Increment it before it is deleted
     880             :                                 // else iterator will get quite confused.
     881           0 :                         delete p;
     882             :                 }
     883           0 :                 Root = 0;
     884           0 :                 Size= 0;
     885           0 :         }
     886             : 
     887             :         //! Is the tree empty?
     888             :         //! \return Returns true if empty, false if not
     889             :         bool empty() const
     890             :         {
     891             :                 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
     892             :                 return Root == 0;
     893             :         }
     894             : 
     895             :         //! \deprecated Use empty() instead. This method may be removed by Irrlicht 1.9
     896             :         _IRR_DEPRECATED_ bool isEmpty() const
     897             :         {
     898             :                 return empty();
     899             :         }
     900             : 
     901             :         //! Search for a node with the specified key.
     902             :         //! \param keyToFind: The key to find
     903             :         //! \return Returns 0 if node couldn't be found.
     904           0 :         Node* find(const KeyType& keyToFind) const
     905             :         {
     906           0 :                 Node* pNode = Root;
     907             : 
     908           0 :                 while(pNode!=0)
     909             :                 {
     910           0 :                         const KeyType& key=pNode->getKey();
     911             : 
     912           0 :                         if (keyToFind == key)
     913           0 :                                 return pNode;
     914           0 :                         else if (keyToFind < key)
     915           0 :                                 pNode = pNode->getLeftChild();
     916             :                         else //keyToFind > key
     917           0 :                                 pNode = pNode->getRightChild();
     918             :                 }
     919             : 
     920           0 :                 return 0;
     921             :         }
     922             : 
     923             :         //! Gets the root element.
     924             :         //! \return Returns a pointer to the root node, or
     925             :         //! 0 if the tree is empty.
     926           0 :         Node* getRoot() const
     927             :         {
     928           0 :                 return Root;
     929             :         }
     930             : 
     931             :         //! Returns the number of nodes in the tree.
     932             :         u32 size() const
     933             :         {
     934             :                 return Size;
     935             :         }
     936             : 
     937             :         //! Swap the content of this map container with the content of another map
     938             :         /** Afterwards this object will contain the content of the other object and the other
     939             :         object will contain the content of this object. Iterators will afterwards be valid for
     940             :         the swapped object.
     941             :         \param other Swap content with this object      */
     942             :         void swap(map<KeyType, ValueType>& other)
     943             :         {
     944             :                 core::swap(Root, other.Root);
     945             :                 core::swap(Size, other.Size);
     946             :         }
     947             : 
     948             :         //------------------------------
     949             :         // Public Iterators
     950             :         //------------------------------
     951             : 
     952             :         //! Returns an iterator
     953             :         Iterator getIterator() const
     954             :         {
     955             :                 Iterator it(getRoot());
     956             :                 return it;
     957             :         }
     958             : 
     959             :         //! Returns a Constiterator
     960             :         ConstIterator getConstIterator() const
     961             :         {
     962             :                 Iterator it(getRoot());
     963             :                 return it;
     964             :         }
     965             : 
     966             :         //! Returns a ParentFirstIterator.
     967             :         //! Traverses the tree from top to bottom. Typical usage is
     968             :         //! when storing the tree structure, because when reading it
     969             :         //! later (and inserting elements) the tree structure will
     970             :         //! be the same.
     971             :         ParentFirstIterator getParentFirstIterator() const
     972             :         {
     973             :                 ParentFirstIterator it(getRoot());
     974             :                 return it;
     975             :         }
     976             : 
     977             :         //! Returns a ParentLastIterator to traverse the tree from
     978             :         //! bottom to top.
     979             :         //! Typical usage is when deleting all elements in the tree
     980             :         //! because you must delete the children before you delete
     981             :         //! their parent.
     982           0 :         ParentLastIterator getParentLastIterator() const
     983             :         {
     984           0 :                 ParentLastIterator it(getRoot());
     985           0 :                 return it;
     986             :         }
     987             : 
     988             :         //------------------------------
     989             :         // Public Operators
     990             :         //------------------------------
     991             : 
     992             :         //! operator [] for access to elements
     993             :         /** for example myMap["key"] */
     994             :         AccessClass operator[](const KeyType& k)
     995             :         {
     996             :                 return AccessClass(*this, k);
     997             :         }
     998             :         private:
     999             : 
    1000             :         //------------------------------
    1001             :         // Disabled methods
    1002             :         //------------------------------
    1003             :         // Copy constructor and assignment operator deliberately
    1004             :         // defined but not implemented. The tree should never be
    1005             :         // copied, pass along references to it instead.
    1006             :         explicit map(const map& src);
    1007             :         map& operator = (const map& src);
    1008             : 
    1009             :         //! Set node as new root.
    1010             :         /** The node will be set to black, otherwise core dumps may arise
    1011             :         (patch provided by rogerborg).
    1012             :         \param newRoot Node which will be the new root
    1013             :         */
    1014           0 :         void setRoot(Node* newRoot)
    1015             :         {
    1016           0 :                 Root = newRoot;
    1017           0 :                 if (Root != 0)
    1018             :                 {
    1019           0 :                         Root->setParent(0);
    1020           0 :                         Root->setBlack();
    1021             :                 }
    1022           0 :         }
    1023             : 
    1024             :         //! Insert a node into the tree without using any fancy balancing logic.
    1025             :         /** \return false if that key already exist in the tree. */
    1026           0 :         bool insert(Node* newNode)
    1027             :         {
    1028           0 :                 bool result=true; // Assume success
    1029             : 
    1030           0 :                 if (Root==0)
    1031             :                 {
    1032           0 :                         setRoot(newNode);
    1033           0 :                         Size = 1;
    1034             :                 }
    1035             :                 else
    1036             :                 {
    1037           0 :                         Node* pNode = Root;
    1038           0 :                         const KeyType& keyNew = newNode->getKey();
    1039           0 :                         while (pNode)
    1040             :                         {
    1041           0 :                                 const KeyType& key=pNode->getKey();
    1042             : 
    1043           0 :                                 if (keyNew == key)
    1044             :                                 {
    1045           0 :                                         result = false;
    1046           0 :                                         pNode = 0;
    1047             :                                 }
    1048           0 :                                 else if (keyNew < key)
    1049             :                                 {
    1050           0 :                                         if (pNode->getLeftChild() == 0)
    1051             :                                         {
    1052           0 :                                                 pNode->setLeftChild(newNode);
    1053           0 :                                                 pNode = 0;
    1054             :                                         }
    1055             :                                         else
    1056           0 :                                                 pNode = pNode->getLeftChild();
    1057             :                                 }
    1058             :                                 else // keyNew > key
    1059             :                                 {
    1060           0 :                                         if (pNode->getRightChild()==0)
    1061             :                                         {
    1062           0 :                                                 pNode->setRightChild(newNode);
    1063           0 :                                                 pNode = 0;
    1064             :                                         }
    1065             :                                         else
    1066             :                                         {
    1067           0 :                                                 pNode = pNode->getRightChild();
    1068             :                                         }
    1069             :                                 }
    1070             :                         }
    1071             : 
    1072           0 :                         if (result)
    1073           0 :                                 ++Size;
    1074             :                 }
    1075             : 
    1076             :                 _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
    1077           0 :                 return result;
    1078             :         }
    1079             : 
    1080             :         //! Rotate left.
    1081             :         //! Pull up node's right child and let it knock node down to the left
    1082           0 :         void rotateLeft(Node* p)
    1083             :         {
    1084           0 :                 Node* right = p->getRightChild();
    1085             : 
    1086           0 :                 p->setRightChild(right->getLeftChild());
    1087             : 
    1088           0 :                 if (p->isLeftChild())
    1089           0 :                         p->getParent()->setLeftChild(right);
    1090           0 :                 else if (p->isRightChild())
    1091           0 :                         p->getParent()->setRightChild(right);
    1092             :                 else
    1093           0 :                         setRoot(right);
    1094             : 
    1095           0 :                 right->setLeftChild(p);
    1096           0 :         }
    1097             : 
    1098             :         //! Rotate right.
    1099             :         //! Pull up node's left child and let it knock node down to the right
    1100           0 :         void rotateRight(Node* p)
    1101             :         {
    1102           0 :                 Node* left = p->getLeftChild();
    1103             : 
    1104           0 :                 p->setLeftChild(left->getRightChild());
    1105             : 
    1106           0 :                 if (p->isLeftChild())
    1107           0 :                         p->getParent()->setLeftChild(left);
    1108           0 :                 else if (p->isRightChild())
    1109           0 :                         p->getParent()->setRightChild(left);
    1110             :                 else
    1111           0 :                         setRoot(left);
    1112             : 
    1113           0 :                 left->setRightChild(p);
    1114           0 :         }
    1115             : 
    1116             :         //------------------------------
    1117             :         // Private Members
    1118             :         //------------------------------
    1119             :         Node* Root; // The top node. 0 if empty.
    1120             :         u32 Size; // Number of nodes in the tree
    1121             : };
    1122             : 
    1123             : } // end namespace core
    1124             : } // end namespace irr
    1125             : 
    1126             : #endif // __IRR_MAP_H_INCLUDED__
    1127             : 

Generated by: LCOV version 1.11