00001 #include <assert.h>
00002 #include "StiTreeNode.h"
00003 #include "Factory.h"
00004
00005
00006
00009 StiTreeNode::StiTreeNode()
00010 {
00011 reset();
00012 }
00013
00014 void StiTreeNode::reset()
00015 {
00016 parent = 0; children[0]=0; children[1]=0;
00017 }
00018
00027
00028 void StiTreeNode::remove(int childIndex)
00029 {
00030 StiTreeNode *node =0;
00031 if (childIndex>=0) {
00032 node =children[childIndex];children[childIndex]=0;
00033 if (!childIndex) {children[0]=children[1]; children[1]=0;}
00034 if (!node) return;
00035 if (node->parent!=this) return;
00036 node->remove(0);
00037
00038 } else {
00039 node = parent; parent=0;
00040 if (!node) return;
00041 node->remove(0);
00042 node->remove(0);
00043 node->remove(-1);
00044 }
00045 node->reset();
00046 BFactory::Free(node);
00047 }
00048
00049 StiTreeNode *StiTreeNode::disconnect(int all)
00050 {
00051 StiTreeNode *node =0;
00052 node = parent; parent=0;
00053 if (!node) return 0;
00054 assert(node->children[0]==this);
00055 assert(!children[1]);
00056 node->children[0]=0;
00057 if (all) return node;
00058 node->children[0]=children[0];
00059 if (children[0]) children[0]->parent=node;
00060 children[0]=0;
00061 return node;
00062 }
00063
00064
00072
00073 void StiTreeNode::setParent(StiTreeNode * newParent)
00074 {
00075 parent = newParent;
00076 }
00077
00078
00082
00083 StiTreeNode * StiTreeNode::getParent() const
00084 {
00085 return parent;
00086 }
00087
00093 StiTreeNode * StiTreeNode::getChildAt(int index) const
00094 {
00095 return children[index];
00096 }
00097
00098
00102
00103 int StiTreeNode::getChildCount() const
00104 {
00105 int n=0;
00106 if(children[0]) n++;
00107 if(children[1]) n++;
00108 return n;
00109 }
00110
00111
00113
00114
00115
00116
00117
00118
00119
00120
00121 StiTreeNode * StiTreeNode::getNextNode() const
00122 {
00123 return children[0];
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 StiTreeNode * StiTreeNode::getPrevNode() const
00138 {
00139 return parent;
00140 }
00141
00142 const StiTreeNode& StiTreeNode::operator=(const StiTreeNode& node)
00143 {
00144 reset();
00145 parent = node.parent;
00146 return *this;
00147 }
00148
00149 void StiTreeNode::add(StiTreeNode * newChild,int direction)
00150 {
00151 if (direction==0) {
00152 assert(!children[1]);
00153 children[1]=children[0];
00154 children[0]=newChild;
00155 newChild->setParent(this);
00156
00157 } else {
00158
00159 assert(!getParent());
00160 setParent(newChild);
00161 newChild->children[0]=this;
00162 newChild->children[1]=0;
00163 }
00164 }
00165
00166 StiTreeNode *StiTreeNode::getLastNode() const
00167 {
00168 const StiTreeNode *node = this;
00169 const StiTreeNode *next = 0;
00170 while ((next = node->getNextNode())) {
00171 node=next;
00172 assert(node!=this);
00173 }
00174 return (StiTreeNode*)node;
00175 }
00176
00177 StiTreeNode *StiTreeNode::getFirstNode() const
00178 {
00179 const StiTreeNode *node = this;
00180 const StiTreeNode *back = 0;
00181 while ((back = node->getPrevNode())) {
00182 node=back;
00183 assert(node!=this);
00184 }
00185 return (StiTreeNode*)node;
00186 }
00187
00188 void StiTreeNode::cutTail(int direction)
00189 {
00190 direction = (direction)? -1:0;
00191 remove(direction);
00192 }
00193
00194
00195
00196
00197
00198
00199
00200
00201