[LCG] Eliminate more boiler plate by using the iterator facade base
authorChandler Carruth <chandlerc@gmail.com>
Sat, 26 Apr 2014 22:51:31 +0000 (22:51 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sat, 26 Apr 2014 22:51:31 +0000 (22:51 +0000)
class.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207336 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/iterator.h
include/llvm/Analysis/LazyCallGraph.h

index 00d0ba15edd63ce05627a1fddff99df523426f26..0b33d7e0a1f7e0697d13a343628eb1eb97c8dfb0 100644 (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,
index 99e6fc25d9905460e4992d1a779985f947de0838..417c610b0a8abb964caa6b93c38757b026edc80d 100644 (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.