#ifndef LLVM_ADT_TREE_H
#define LLVM_ADT_TREE_H
#include <vector>
namespace llvm {
template<class ConcreteTreeNode, class Payload>
class Tree {
std::vector<ConcreteTreeNode*> Children; ConcreteTreeNode *Parent; Payload Data;
protected:
void setChildren(const std::vector<ConcreteTreeNode*> &children) {
Children = children;
}
public:
inline Tree(ConcreteTreeNode *parent) : Parent(parent) {}
inline Tree(const std::vector<ConcreteTreeNode*> &children,
ConcreteTreeNode *par) : Children(children), Parent(par) {}
inline Tree(const std::vector<ConcreteTreeNode*> &children,
ConcreteTreeNode *par, const Payload &data)
: Children(children), Parent(par), Data(data) {}
inline ~Tree() {
for (unsigned i = Children.size(); i > 0; --i)
delete Children[i-1];
}
inline ConcreteTreeNode *getParent() const { return Parent; }
inline unsigned getNumChildren() const { return Children.size(); }
inline ConcreteTreeNode *getChild(unsigned i) const {
assert(i < Children.size() && "Tree::getChild with index out of range!");
return Children[i];
}
inline Payload &getTreeData() { return Data; }
inline const Payload &getTreeData() const { return Data; }
};
}
#endif