[LCG] Eliminate more boiler plate by using the iterator facade base

class.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207336 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2014-04-26 22:51:31 +00:00
parent b9acdb79a5
commit bbec604000
2 changed files with 4 additions and 11 deletions

View File

@ -32,7 +32,7 @@ namespace llvm {
/// terms of addition of one. These aren't equivalent for all iterator
/// categories, and respecting that adds a lot of complexity for little gain.
template <typename DerivedT, typename IteratorCategoryT, typename T,
typename DifferenceTypeT, typename PointerT = T *,
typename DifferenceTypeT = ptrdiff_t, typename PointerT = T *,
typename ReferenceT = T &>
struct iterator_facade_base
: std::iterator<IteratorCategoryT, T, DifferenceTypeT, PointerT,

View File

@ -228,7 +228,8 @@ public:
/// always visits SCCs for a callee prior to visiting the SCC for a caller
/// (when they are in different SCCs).
class postorder_scc_iterator
: public std::iterator<std::forward_iterator_tag, SCC> {
: public iterator_facade_base<postorder_scc_iterator,
std::forward_iterator_tag, SCC> {
friend class LazyCallGraph;
friend class LazyCallGraph::Node;
@ -251,22 +252,14 @@ public:
bool operator==(const postorder_scc_iterator &Arg) const {
return G == Arg.G && C == Arg.C;
}
bool operator!=(const postorder_scc_iterator &Arg) const {
return !operator==(Arg);
}
reference operator*() const { return *C; }
pointer operator->() const { return &operator*(); }
using iterator_facade_base::operator++;
postorder_scc_iterator &operator++() {
C = G->getNextSCCInPostOrder();
return *this;
}
postorder_scc_iterator operator++(int) {
postorder_scc_iterator prev = *this;
++*this;
return prev;
}
};
/// \brief Construct a graph for the given module.