00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ROUTER_ROUTETREENODE_HPP
00020 #define TORC_ROUTER_ROUTETREENODE_HPP
00021
00022 #include "torc/router/RouteNode.hpp"
00023
00024 namespace torc {
00025 namespace router {
00026
00027
00028
00029
00030 #ifdef __GNUC__
00031 #pragma pack(push, 2)
00032 #endif
00033
00034
00035
00036
00037 class RouteTreeNode : public RouteNode {
00038
00039 typedef std::vector<RouteTreeNode*>::iterator RouteTreeNodeIterator;
00040 protected:
00041
00042
00043 RouteTreeNode* mOnlyChild;
00044
00045 std::vector<RouteTreeNode*>* mChildren;
00046 public:
00047
00048
00049
00050 RouteTreeNode() : RouteNode(), mOnlyChild(0), mChildren(0) {}
00051
00052 RouteTreeNode(Tilewire inSource, Tilewire inSink, boost::int32_t inCost,
00053 RouteTreeNode* inParent)
00054 : RouteNode(inSource, inSink, inCost, inCost, 0, inParent), mOnlyChild(0),
00055 mChildren(0) {
00056 if (inParent != 0) {
00057 mDepth = inParent->getDepth() + 1;
00058 } else {
00059 mDepth = 0;
00060 }
00061 }
00062
00063 RouteTreeNode(Arc inArc, boost::int32_t inCost, RouteTreeNode* inParent)
00064 : RouteNode(inArc, inCost, inCost, 0, inParent), mOnlyChild(0), mChildren(0) {
00065 if (inParent != 0) {
00066 mDepth = inParent->getDepth() + 1;
00067 } else {
00068 mDepth = 0;
00069 }
00070 }
00071
00072 ~RouteTreeNode() {
00073 if (mOnlyChild != 0) { delete mOnlyChild; mOnlyChild = 0; }
00074 if (mChildren != 0) {
00075 RouteTreeNodeIterator p = mChildren->begin();
00076 RouteTreeNodeIterator e = mChildren->end();
00077 while (p < e) { delete *p, p++; }
00078 delete mChildren; mChildren = 0;
00079 }
00080 }
00081
00082
00083
00084
00085 void addChildren(const std::vector<RouteTreeNode*>& newChildren) {
00086 boost::uint32_t size = newChildren.size();
00087 if (size == 0) { return; }
00088
00089
00090 if (mChildren == 0) {
00091
00092 if (mOnlyChild == 0 && size == 1) {
00093 mOnlyChild = newChildren[0];
00094 return;
00095 }
00096
00097 mChildren = new std::vector<RouteTreeNode*>();
00098
00099 if (mOnlyChild != 0) {
00100 mChildren->reserve(size+1);
00101 mChildren->push_back(mOnlyChild);
00102 mOnlyChild = 0;
00103
00104 } else {
00105 mChildren->reserve(size);
00106 }
00107
00108 } else {
00109 mChildren->reserve(mChildren->size() + size);
00110 }
00111
00112 mChildren->insert(mChildren->end(), newChildren.begin(), newChildren.end());
00113 }
00114
00115 void makeParent(const Tilewire& inSource, const Tilewire& inSink) {
00116
00117
00118 mParent = new RouteTreeNode(inSource, inSink, 0, 0);
00119 ((RouteTreeNode*)mParent)->mOnlyChild = this;
00120 ((RouteTreeNode*)mParent)->mDepth = mDepth - 1;
00121 }
00122
00123 boost::uint16_t getNumChildren() {
00124 if (mOnlyChild != 0) return 1;
00125 else if (mChildren == 0) return 0;
00126 return mChildren->size();
00127 }
00128
00129 RouteTreeNode* getChild(unsigned int index) {
00130 if (mOnlyChild != 0 && index == 0) return mOnlyChild;
00131 if (mChildren != 0 && index < mChildren->size()) return (*mChildren)[index];
00132 return 0;
00133 }
00134
00135 void normalizeDepth() {
00136 RouteTreeNode* top = (RouteTreeNode*) getTop();
00137 int topDepth = top->mDepth;
00138 if (topDepth == 0) return;
00139 top->adjustDepth(-topDepth);
00140 }
00141 protected:
00142
00143 void adjustDepth(int adjustment) {
00144 mDepth += adjustment;
00145 if (mOnlyChild != 0) mOnlyChild->adjustDepth(adjustment);
00146 else if (mChildren != 0) {
00147 RouteTreeNodeIterator p = mChildren->begin();
00148 RouteTreeNodeIterator e = mChildren->end();
00149 while (p < e) {
00150 (*p)->adjustDepth(adjustment);
00151 p++;
00152 }
00153 }
00154 }
00155 };
00156
00157 #ifdef __GNUC__
00158 #pragma pack(pop)
00159 #endif
00160
00161 }
00162 }
00163
00164 #endif // TORC_ROUTER_ROUTETREENODE_HPP