-//===-- Support/PostOrderIterator.h - Generic PostOrder iterator -*- C++ -*--=//
+//===- Support/PostOrderIterator.h - Generic PostOrder iterator -*- 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 builds on the Support/GraphTraits.h file to build a generic graph
// post order iterator. This should work over any graph type that has a
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_SUPPORT_POSTORDER_ITERATOR_H
-#define LLVM_SUPPORT_POSTORDER_ITERATOR_H
+#ifndef SUPPORT_POSTORDERITERATOR_H
+#define SUPPORT_POSTORDERITERATOR_H
#include "Support/GraphTraits.h"
-#include <Support/iterator>
+#include "Support/iterator"
#include <stack>
#include <set>
+namespace llvm {
+
template<class GraphT, class GT = GraphTraits<GraphT> >
class po_iterator : public forward_iterator<typename GT::NodeType, ptrdiff_t> {
typedef forward_iterator<typename GT::NodeType, ptrdiff_t> super;
- typedef typename super::pointer pointer;
typedef typename GT::NodeType NodeType;
typedef typename GT::ChildIteratorType ChildItTy;
}
inline po_iterator() { /* End is when stack is empty */ }
public:
+ typedef typename super::pointer pointer;
typedef po_iterator<GraphT, GT> _Self;
// Provide static "constructors"...
// computer RPO from a graph. Because of this, the construction of the
// ReversePostOrderTraversal object is expensive (it must walk the entire graph
// with a postorder iterator to build the data structures). The moral of this
-// story is: Don't create more ReversePostOrderTraversal classes than neccesary.
+// story is: Don't create more ReversePostOrderTraversal classes than necessary.
//
// This class should be used like this:
// {
-// ReversePostOrderTraversal<Method*> RPOT(MethodPtr); // Expensive to create
+// ReversePostOrderTraversal<Function*> RPOT(FuncPtr); // Expensive to create
// for (rpo_iterator I = RPOT.begin(); I != RPOT.end(); ++I) {
// ...
// }
copy(po_begin(BB), po_end(BB), back_inserter(Blocks));
}
public:
- typedef std::vector<NodeType*>::reverse_iterator rpo_iterator;
+ typedef typename std::vector<NodeType*>::reverse_iterator rpo_iterator;
inline ReversePostOrderTraversal(GraphT G) {
Initialize(GT::getEntryNode(G));
inline rpo_iterator end() { return Blocks.rend(); }
};
+} // End llvm namespace
+
#endif