mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +00:00
d2aa7b8ee7
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10263 91177308-0d34-0410-b5e6-96231b3b80d8
63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
//===- Support/Tree.h - Generic n-way tree structure ------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This class defines a generic N way tree node structure. The tree structure
|
|
// is immutable after creation, but the payload contained within it is not.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SUPPORT_TREE_H
|
|
#define SUPPORT_TREE_H
|
|
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
|
|
template<class ConcreteTreeNode, class Payload>
|
|
class Tree {
|
|
std::vector<ConcreteTreeNode*> Children; // This nodes children, if any
|
|
ConcreteTreeNode *Parent; // Parent of this node...
|
|
Payload Data; // Data held in this node...
|
|
|
|
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) {}
|
|
|
|
// Tree dtor - Free all children
|
|
inline ~Tree() {
|
|
for (unsigned i = Children.size(); i > 0; --i)
|
|
delete Children[i-1];
|
|
}
|
|
|
|
// Tree manipulation/walking routines...
|
|
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];
|
|
}
|
|
|
|
// Payload access...
|
|
inline Payload &getTreeData() { return Data; }
|
|
inline const Payload &getTreeData() const { return Data; }
|
|
};
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|