16 #ifndef LLVM_ADT_POSTORDERITERATOR_H
17 #define LLVM_ADT_POSTORDERITERATOR_H
57 template<
class SetType,
bool External>
63 template <
typename NodeRef>
65 return Visited.insert(To).second;
73 template<
class SetType>
85 return Visited.insert(To).second;
92 template <
class GraphT,
94 SmallPtrSet<typename GraphTraits<GraphT>::NodeRef, 8>,
95 bool ExtStorage =
false,
class GT = GraphTraits<GraphT>>
97 :
public std::iterator<std::forward_iterator_tag, typename GT::NodeRef>,
99 typedef std::iterator<std::forward_iterator_tag, typename GT::NodeRef> super;
100 typedef typename GT::NodeRef NodeRef;
101 typedef typename GT::ChildIteratorType ChildItTy;
105 std::vector<std::pair<NodeRef, ChildItTy>> VisitStack;
107 void traverseChild() {
108 while (VisitStack.back().second != GT::child_end(VisitStack.back().first)) {
109 NodeRef BB = *VisitStack.back().second++;
112 VisitStack.push_back(std::make_pair(BB, GT::child_begin(BB)));
119 VisitStack.push_back(std::make_pair(BB, GT::child_begin(BB)));
128 VisitStack.push_back(std::make_pair(BB, GT::child_begin(BB)));
152 return VisitStack == x.VisitStack;
156 const NodeRef &
operator*()
const {
return VisitStack.back().first; }
166 VisitStack.pop_back();
167 if (!VisitStack.empty())
191 template <class T, class SetType = std::set<typename GraphTraits<T>::NodeRef>>
197 template<
class T,
class SetType>
202 template<
class T,
class SetType>
207 template <
class T,
class SetType>
213 template <class T, class SetType = std::set<typename GraphTraits<T>::NodeRef>,
214 bool External =
false>
236 template <class T, class SetType = std::set<typename GraphTraits<T>::NodeRef>>
244 template <
class T,
class SetType>
249 template <
class T,
class SetType>
254 template <
class T,
class SetType>
255 iterator_range<ipo_ext_iterator<T, SetType>>
283 template<
class GraphT,
class GT = GraphTraits<GraphT>>
285 typedef typename GT::NodeRef NodeRef;
286 std::vector<NodeRef> Blocks;
288 void Initialize(NodeRef BB) {
304 #endif // LLVM_ADT_POSTORDERITERATOR_H
po_iterator & operator++()
po_ext_iterator< T, SetType > po_ext_end(T G, SetType &S)
static po_iterator end(GraphT G, SetType &S)
NodeRef operator->() const
ipo_ext_iterator(const ipo_iterator< T, SetType, true > &V)
This provides a very simple, boring adaptor for a begin and end iterator into a range type...
static po_iterator begin(GraphT G)
ipo_ext_iterator(const po_iterator< Inverse< T >, SetType, true > &V)
po_iterator operator++(int)
po_ext_iterator(const po_iterator< T, SetType, true > &V)
bool operator!=(const po_iterator &x) const
static po_iterator begin(GraphT G, SetType &S)
bool insertEdge(Optional< NodeRef > From, NodeRef To)
bool operator==(const po_iterator &x) const
ipo_iterator< T > ipo_end(const T &G)
ReversePostOrderTraversal(GraphT G)
void finishPostorder(NodeRef BB)
ipo_ext_iterator< T, SetType > ipo_ext_begin(const T &G, SetType &S)
void finishPostorder(NodeRef BB)
ipo_ext_iterator< T, SetType > ipo_ext_end(const T &G, SetType &S)
static po_iterator end(GraphT G)
po_iterator_storage(const po_iterator_storage &S)
std::vector< NodeRef >::reverse_iterator rpo_iterator
Default po_iterator_storage implementation with an internal set object.
po_iterator< T > po_end(const T &G)
iterator_range< po_iterator< T > > post_order(const T &G)
bool insertEdge(Optional< NodeRef > From, NodeRef To)
const NodeRef & operator*() const
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< po_ext_iterator< T, SetType > > post_order_ext(const T &G, SetType &S)
A range adaptor for a pair of iterators.
ipo_iterator< T > ipo_begin(const T &G)
iterator_range< ipo_ext_iterator< T, SetType > > inverse_post_order_ext(const T &G, SetType &S)
po_iterator_storage(SetType &VSet)
po_ext_iterator< T, SetType > po_ext_begin(T G, SetType &S)
ipo_iterator(const po_iterator< Inverse< T >, SetType, External > &V)
iterator_range< ipo_iterator< T > > inverse_post_order(const T &G)
po_iterator< T > po_begin(const T &G)