26 #ifndef GRALE_GRIDTREE_H
28 #define GRALE_GRIDTREE_H
30 #include "graleconfig.h"
40 class GRALE_IMPORTEXPORT GridNodeBase
43 enum GridNodeType { TreeNode, WeightNode };
45 GridNodeBase(GridNodeType t, GridNodeBase *pParent,
int childNumber,
int level)
49 m_childNumber = childNumber;
53 virtual ~GridNodeBase() { }
54 virtual GridNodeBase *createCopy()
const = 0;
55 GridNodeType getNodeType()
const {
return m_nodeType; }
56 GridNodeBase *getParent()
const {
return m_pParent; }
57 int getChildNumber()
const {
return m_childNumber; }
58 int getLevel()
const {
return m_level; }
59 void setChildInfo(GridNodeBase *pParent,
int childNumber) { m_pParent = pParent; m_childNumber = childNumber; }
60 virtual void setLevel(
int level) { m_level = level; }
63 virtual void print(
int tab = 0) = 0;
65 GridNodeType m_nodeType;
66 GridNodeBase *m_pParent;
71 class GRALE_IMPORTEXPORT GridWeightNode :
public GridNodeBase
74 GridWeightNode(
float w, GridNodeBase *pParent,
int childNumber,
int level) : GridNodeBase(WeightNode, pParent, childNumber, level)
77 float getWeight()
const {
return m_weight; }
78 void setWeight(
float w) { m_weight = w; }
79 GridNodeBase *createCopy()
const {
return new GridWeightNode(m_weight, 0, -1, 0); }
82 void print(
int tab = 0) {
for (
int i = 0 ; i < tab ; i++) printf(
" "); printf(
"%g (%d)\n",(
double)m_weight, getLevel()); }
87 class GRALE_IMPORTEXPORT GridTreeNode :
public GridNodeBase
90 GridTreeNode(GridNodeBase *pParent,
int childNumber,
int level,
int numChildren = 4) : GridNodeBase(TreeNode, pParent, childNumber, level)
92 m_pChild.resize(numChildren);
93 for (
int i = 0 ; i < numChildren ; i++)
99 for (
int i = 0 ; i < m_pChild.size() ; i++)
104 int getNumberOfChildren()
const {
return m_pChild.size(); }
108 for (
int i = 0 ; i < m_pChild.size() ; i++)
110 if (m_pChild[i] == 0)
112 if (m_pChild[i]->getNodeType() == TreeNode)
114 const GridTreeNode *pNode = (
const GridTreeNode *)m_pChild[i];
116 if (!pNode->isValid())
123 void setNode(
int i, GridNodeBase *pNode)
131 m_pChild[i]->setChildInfo(
this, i);
132 m_pChild[i]->setLevel(getLevel()+1);
136 void setNodeNoLevel(
int i, GridNodeBase *pNode)
144 m_pChild[i]->setChildInfo(
this, i);
148 GridNodeBase *createCopy()
const
150 GridTreeNode *pNewNode =
new GridTreeNode(0, -1, 0, m_pChild.size());
151 for (
int i = 0 ; i < m_pChild.size() ; i++)
153 GridNodeBase *pNode = m_pChild[i];
155 pNode = pNode->createCopy();
156 pNewNode->setNode(i, pNode);
161 const GridNodeBase *getChild(
int i)
const {
return m_pChild[i]; }
162 GridNodeBase *getChild(
int i) {
return m_pChild[i]; }
164 void setLevel(
int level)
166 GridNodeBase::setLevel(level);
167 for (
int i = 0 ; i < m_pChild.size() ; i++)
169 m_pChild[i]->setLevel(level+1);
172 GridNodeBase *extractChild(
int i)
174 GridNodeBase *pChild = m_pChild[i];
180 void print(
int tab = 0) {
for (
int i = 0 ; i < tab ; i++) printf(
" "); printf(
"Node (%d)\n", getLevel());
for (
int i = 0 ; i < m_pChild.size() ; i++) {
if (!m_pChild[i]) {
for (
int i = 0 ; i < tab+1 ; i++) printf(
" "); printf(
"NULL\n"); }
else { m_pChild[i]->print(tab+1); } } }
182 std::vector<GridNodeBase *> m_pChild;
187 #endif // GRALE_GRIDTREE_H