Because I like being able to instantiate the cfgprinter from external projects,
[oota-llvm.git] / include / llvm / Analysis / Interval.h
index 3974c72871678cea37e5dcbf564f5833e267e8e9..0d5912305bc57ee8296ea6e8f9d0b424c2b3ada9 100644 (file)
@@ -1,4 +1,11 @@
 //===- llvm/Analysis/Interval.h - Interval Class Declaration ----*- 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 file contains the declaration of the Interval class, which
 // represents a set of CFG nodes and is a portion of an interval partition.
 #ifndef LLVM_INTERVAL_H
 #define LLVM_INTERVAL_H
 
+#include "Support/GraphTraits.h"
 #include <vector>
 #include <iosfwd>
 
+namespace llvm {
+
 class BasicBlock;
 
 //===----------------------------------------------------------------------===//
@@ -49,7 +59,7 @@ public:
 
   // Successors - List of BasicBlocks that are reachable directly from nodes in
   // this interval, but are not in the interval themselves.
-  // These nodes neccesarily must be header nodes for other intervals.
+  // These nodes necessarily must be header nodes for other intervals.
   //
   std::vector<BasicBlock*> Successors;
 
@@ -111,4 +121,33 @@ inline Interval::pred_iterator pred_end(Interval *I)   {
   return I->Predecessors.end();
 }
 
+template <> struct GraphTraits<Interval*> {
+  typedef Interval NodeType;
+  typedef Interval::succ_iterator ChildIteratorType;
+
+  static NodeType *getEntryNode(Interval *I) { return I; }
+
+  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
+  static inline ChildIteratorType child_begin(NodeType *N) { 
+    return succ_begin(N);
+  }
+  static inline ChildIteratorType child_end(NodeType *N) { 
+    return succ_end(N);
+  }
+};
+
+template <> struct GraphTraits<Inverse<Interval*> > {
+  typedef Interval NodeType;
+  typedef Interval::pred_iterator ChildIteratorType;
+  static NodeType *getEntryNode(Inverse<Interval *> G) { return G.Graph; }
+  static inline ChildIteratorType child_begin(NodeType *N) { 
+    return pred_begin(N);
+  }
+  static inline ChildIteratorType child_end(NodeType *N) { 
+    return pred_end(N);
+  }
+};
+
+} // End llvm namespace
+
 #endif