34#ifndef LLVM_ADT_DEPTHFIRSTITERATOR_H
35#define LLVM_ADT_DEPTHFIRSTITERATOR_H
50template<
class SetType,
bool External>
56template<
class SetType>
69template <
typename NodeRef,
unsigned SmallSize = 8>
75 template <
typename IterT>
82template <
class GraphT,
84 df_iterator_default_set<typename GraphTraits<GraphT>::NodeRef>,
85 bool ExtStorage =
false,
class GT = GraphTraits<GraphT>>
90 std::conditional_t<ExtStorage, std::input_iterator_tag,
91 std::forward_iterator_tag>;
98 using NodeRef =
typename GT::NodeRef;
99 using ChildItTy =
typename GT::ChildIteratorType;
104 using StackElement = std::pair<NodeRef, std::optional<ChildItTy>>;
107 std::vector<StackElement> VisitStack;
109 inline df_iterator(NodeRef
Node) {
111 VisitStack.push_back(StackElement(
Node, std::nullopt));
118 if (this->
Visited.insert(Node).second)
119 VisitStack.push_back(StackElement(
Node, std::nullopt));
122 inline df_iterator(SetType &S)
123 : df_iterator_storage<SetType, ExtStorage>(S) {
127 inline void toNext() {
129 NodeRef
Node = VisitStack.back().first;
130 std::optional<ChildItTy> &Opt = VisitStack.back().second;
133 Opt.emplace(GT::child_begin(Node));
138 while (*Opt != GT::child_end(Node)) {
139 NodeRef
Next = *(*Opt)++;
143 VisitStack.push_back(StackElement(
Next, std::nullopt));
150 VisitStack.pop_back();
151 }
while (!VisitStack.empty());
156 static df_iterator
begin(
const GraphT &
G) {
157 return df_iterator(GT::getEntryNode(
G));
159 static df_iterator
end(
const GraphT &
G) {
return df_iterator(); }
162 static df_iterator
begin(
const GraphT &
G, SetType &S) {
163 return df_iterator(GT::getEntryNode(
G), S);
165 static df_iterator
end(
const GraphT &
G, SetType &S) {
return df_iterator(S); }
168 return VisitStack == x.VisitStack;
170 bool operator!=(
const df_iterator &x)
const {
return !(*
this == x); }
190 VisitStack.pop_back();
191 if (!VisitStack.empty())
197 df_iterator tmp = *
this;
215 NodeRef
getPath(
unsigned n)
const {
return VisitStack[n].first; }
239 df_iterator_default_set<typename GraphTraits<T>::NodeRef>>
242 : df_iterator<
T, SetTy,
true>(V) {}
245template <
class T,
class SetTy>
250template <
class T,
class SetTy>
255template <
class T,
class SetTy>
264 df_iterator_default_set<typename GraphTraits<T>::NodeRef>,
265 bool External =
false>
268 : df_iterator<
Inverse<
T>, SetTy, External>(V) {}
290 df_iterator_default_set<typename GraphTraits<T>::NodeRef>>
298template <
class T,
class SetTy>
303template <
class T,
class SetTy>
308template <
class T,
class SetTy>
This file defines the little GraphTraits<X> template class that should be specialized by classes that...
This file defines the SmallPtrSet class.
std::pair< iterator, bool > insert(NodeRef Ptr)
SmallPtrSetIterator< NodeRef > iterator
df_iterator_storage(const df_iterator_storage &S)
df_iterator_storage(SetType &VSet)
df_iterator & operator++()
static df_iterator begin(const GraphT &G)
NodeRef operator->() const
std::conditional_t< ExtStorage, std::input_iterator_tag, std::forward_iterator_tag > iterator_category
static df_iterator end(const GraphT &G)
const value_type & reference
static df_iterator end(const GraphT &G, SetType &S)
df_iterator & skipChildren()
Skips all children of the current node and traverses to next node.
unsigned getPathLength() const
Return the length of the path from the entry node to the current node, counting both nodes.
bool operator==(const df_iterator &x) const
df_iterator operator++(int)
bool operator!=(const df_iterator &x) const
bool nodeVisited(NodeRef Node) const
NodeRef getPath(unsigned n) const
Return the n'th node in the path from the entry node to the current node.
static df_iterator begin(const GraphT &G, SetType &S)
reference operator*() const
std::ptrdiff_t difference_type
typename GT::NodeRef value_type
A range adaptor for a pair of iterators.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
NodeAddr< NodeBase * > Node
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< df_ext_iterator< T, SetTy > > depth_first_ext(const T &G, SetTy &S)
idf_ext_iterator< T, SetTy > idf_ext_end(const T &G, SetTy &S)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
df_iterator< T > df_begin(const T &G)
idf_ext_iterator< T, SetTy > idf_ext_begin(const T &G, SetTy &S)
iterator_range< idf_iterator< T > > inverse_depth_first(const T &G)
df_ext_iterator< T, SetTy > df_ext_begin(const T &G, SetTy &S)
idf_iterator< T > idf_end(const T &G)
iterator_range< idf_ext_iterator< T, SetTy > > inverse_depth_first_ext(const T &G, SetTy &S)
FunctionAddr VTableAddr Next
idf_iterator< T > idf_begin(const T &G)
df_ext_iterator< T, SetTy > df_ext_end(const T &G, SetTy &S)
df_iterator< T > df_end(const T &G)
iterator_range< df_iterator< T > > depth_first(const T &G)
df_ext_iterator(const df_iterator< T, SetTy, true > &V)
void insert(IterT Begin, IterT End)
typename BaseSet::iterator iterator
SmallPtrSet< NodeRef, SmallSize > BaseSet
std::pair< iterator, bool > insert(NodeRef N)
idf_ext_iterator(const idf_iterator< T, SetTy, true > &V)
idf_ext_iterator(const df_iterator< Inverse< T >, SetTy, true > &V)
idf_iterator(const df_iterator< Inverse< T >, SetTy, External > &V)