Genericize the ReversePostOrderIterator.
authorChris Lattner <sabre@nondot.org>
Sun, 24 Feb 2002 21:48:59 +0000 (21:48 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 24 Feb 2002 21:48:59 +0000 (21:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1785 91177308-0d34-0410-b5e6-96231b3b80d8

include/Support/PostOrderIterator.h
include/llvm/ADT/PostOrderIterator.h
tools/dis/dis.cpp
tools/llvm-dis/dis.cpp
tools/llvm-dis/llvm-dis.cpp

index 97027114cf9f82617641e958406851552eb06031..29d315e89c90c3cbae5820e0278e513a2d7de2a4 100644 (file)
@@ -112,32 +112,28 @@ ipo_iterator<T> ipo_end(T G){
 //
 // This class should be used like this:
 // {
-//   cfg::ReversePostOrderTraversal RPOT(MethodPtr);   // Expensive to create
-//   for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
+//   ReversePostOrderTraversal<Method*> RPOT(MethodPtr); // Expensive to create
+//   for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
 //      ...
 //   }
-//   for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
+//   for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
 //      ...
 //   }
 // }
 //
 
-#include "llvm/BasicBlock.h"  // FIXME!
-#include "llvm/Method.h"      // FIXME!
-
-typedef std::vector<BasicBlock*>::reverse_iterator rpo_iterator;
-// TODO: FIXME: ReversePostOrderTraversal is not generic!
+template<class GraphT, class GT = GraphTraits<GraphT> >
 class ReversePostOrderTraversal {
-  std::vector<BasicBlock*> Blocks;       // Block list in normal PO order
-  inline void Initialize(BasicBlock *BB) {
+  typedef typename GT::NodeType NodeType;
+  std::vector<NodeType*> Blocks;       // Block list in normal PO order
+  inline void Initialize(NodeType *BB) {
     copy(po_begin(BB), po_end(BB), back_inserter(Blocks));
   }
 public:
-  inline ReversePostOrderTraversal(Method *M) {
-    Initialize(M->front());
-  }
-  inline ReversePostOrderTraversal(BasicBlock *BB) {
-    Initialize(BB);
+  typedef std::vector<NodeType*>::reverse_iterator rpo_iterator;
+
+  inline ReversePostOrderTraversal(GraphT G) {
+    Initialize(GT::getEntryNode(G));
   }
 
   // Because we want a reverse post order, use reverse iterators from the vector
index 97027114cf9f82617641e958406851552eb06031..29d315e89c90c3cbae5820e0278e513a2d7de2a4 100644 (file)
@@ -112,32 +112,28 @@ ipo_iterator<T> ipo_end(T G){
 //
 // This class should be used like this:
 // {
-//   cfg::ReversePostOrderTraversal RPOT(MethodPtr);   // Expensive to create
-//   for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
+//   ReversePostOrderTraversal<Method*> RPOT(MethodPtr); // Expensive to create
+//   for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
 //      ...
 //   }
-//   for (cfg::rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
+//   for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
 //      ...
 //   }
 // }
 //
 
-#include "llvm/BasicBlock.h"  // FIXME!
-#include "llvm/Method.h"      // FIXME!
-
-typedef std::vector<BasicBlock*>::reverse_iterator rpo_iterator;
-// TODO: FIXME: ReversePostOrderTraversal is not generic!
+template<class GraphT, class GT = GraphTraits<GraphT> >
 class ReversePostOrderTraversal {
-  std::vector<BasicBlock*> Blocks;       // Block list in normal PO order
-  inline void Initialize(BasicBlock *BB) {
+  typedef typename GT::NodeType NodeType;
+  std::vector<NodeType*> Blocks;       // Block list in normal PO order
+  inline void Initialize(NodeType *BB) {
     copy(po_begin(BB), po_end(BB), back_inserter(Blocks));
   }
 public:
-  inline ReversePostOrderTraversal(Method *M) {
-    Initialize(M->front());
-  }
-  inline ReversePostOrderTraversal(BasicBlock *BB) {
-    Initialize(BB);
+  typedef std::vector<NodeType*>::reverse_iterator rpo_iterator;
+
+  inline ReversePostOrderTraversal(GraphT G) {
+    Initialize(GT::getEntryNode(G));
   }
 
   // Because we want a reverse post order, use reverse iterators from the vector
index 3495465d3f4add6cd55abc8a5a0b598da4e0d9ce..04fc60b2f1fef3c89b9414af1fa7b3f4af609a47 100644 (file)
@@ -124,7 +124,7 @@ int main(int argc, char **argv) {
             std::ostream_iterator<BasicBlock*>(*Out, "\n"));
        break;
       case rpo: {           // Reverse Post Order
-       ReversePostOrderTraversal RPOT(M);
+       ReversePostOrderTraversal<Method*> RPOT(M);
        copy(RPOT.begin(), RPOT.end(),
             std::ostream_iterator<BasicBlock*>(*Out, "\n"));
        break;
index 3495465d3f4add6cd55abc8a5a0b598da4e0d9ce..04fc60b2f1fef3c89b9414af1fa7b3f4af609a47 100644 (file)
@@ -124,7 +124,7 @@ int main(int argc, char **argv) {
             std::ostream_iterator<BasicBlock*>(*Out, "\n"));
        break;
       case rpo: {           // Reverse Post Order
-       ReversePostOrderTraversal RPOT(M);
+       ReversePostOrderTraversal<Method*> RPOT(M);
        copy(RPOT.begin(), RPOT.end(),
             std::ostream_iterator<BasicBlock*>(*Out, "\n"));
        break;
index 3495465d3f4add6cd55abc8a5a0b598da4e0d9ce..04fc60b2f1fef3c89b9414af1fa7b3f4af609a47 100644 (file)
@@ -124,7 +124,7 @@ int main(int argc, char **argv) {
             std::ostream_iterator<BasicBlock*>(*Out, "\n"));
        break;
       case rpo: {           // Reverse Post Order
-       ReversePostOrderTraversal RPOT(M);
+       ReversePostOrderTraversal<Method*> RPOT(M);
        copy(RPOT.begin(), RPOT.end(),
             std::ostream_iterator<BasicBlock*>(*Out, "\n"));
        break;