Generic k-way tree support
authorChris Lattner <sabre@nondot.org>
Fri, 14 Sep 2001 01:42:01 +0000 (01:42 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 14 Sep 2001 01:42:01 +0000 (01:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@554 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Tree.h [new file with mode: 0644]

diff --git a/include/llvm/Support/Tree.h b/include/llvm/Support/Tree.h
new file mode 100644 (file)
index 0000000..679b6df
--- /dev/null
@@ -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