diff options
| author | Chris Lattner <sabre@nondot.org> | 2001-09-14 01:42:01 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2001-09-14 01:42:01 +0000 |
| commit | aa8d4c7517e2d4ce2f66f051fba0f11a1d0e8c2f (patch) | |
| tree | 35f39f9207d1991e260ceef3abe89a0e268c5b13 /llvm | |
| parent | f8459bb19993d6c068f27d425d51dd6fda794772 (diff) | |
| download | bcm5719-llvm-aa8d4c7517e2d4ce2f66f051fba0f11a1d0e8c2f.tar.gz bcm5719-llvm-aa8d4c7517e2d4ce2f66f051fba0f11a1d0e8c2f.zip | |
Generic k-way tree support
llvm-svn: 554
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Support/Tree.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/include/llvm/Support/Tree.h b/llvm/include/llvm/Support/Tree.h new file mode 100644 index 00000000000..679b6dfd836 --- /dev/null +++ b/llvm/include/llvm/Support/Tree.h @@ -0,0 +1,52 @@ +//===- llvm/Support/Tree.h - Generic n-way tree structure --------*- C++ -*--=// +// +// 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 LLVM_SUPPORT_TREE_H +#define LLVM_SUPPORT_TREE_H + +#include <vector> + +template<class ConcreteTreeNode, class Payload> +class Tree { + 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 vector<ConcreteTreeNode*> &children) { + Children = children; + } +public: + inline Tree(ConcreteTreeNode *parent) : Parent(parent) {} + inline Tree(const vector<ConcreteTreeNode*> &children, ConcreteTreeNode *par) + : Children(children), Parent(par) {} + + inline Tree(const vector<ConcreteTreeNode*> &children, ConcreteTreeNode *par, + const Payload &data) + : Children(children), Parent(parent), 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; } +}; + + +#endif |

