diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-04-29 01:57:35 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-04-29 01:57:35 +0000 |
commit | b913bd485a373b699ef15f5c1870ad2fcd40d839 (patch) | |
tree | bdc4e915291cf1dfebab6d2d2f74d39ca290043f /include | |
parent | 270f09d712d806443dffa4a1e697f91d6934813e (diff) | |
download | llvm-b913bd485a373b699ef15f5c1870ad2fcd40d839.tar.gz llvm-b913bd485a373b699ef15f5c1870ad2fcd40d839.tar.bz2 llvm-b913bd485a373b699ef15f5c1870ad2fcd40d839.tar.xz |
[ADT] Make the iterator adaptor utility a touch more general by
requiring full control over the various parameters to the std::iterator
concept / trait thing. This is a precursor for adjusting these things to
where you can write a bidirectional iterator wrapping a random access
iterator with custom increment and decrement logic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207487 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/ADT/iterator.h | 27 | ||||
-rw-r--r-- | include/llvm/Analysis/LazyCallGraph.h | 5 | ||||
-rw-r--r-- | include/llvm/IR/User.h | 5 |
3 files changed, 23 insertions, 14 deletions
diff --git a/include/llvm/ADT/iterator.h b/include/llvm/ADT/iterator.h index af9b85c56c..8d6a8eb163 100644 --- a/include/llvm/ADT/iterator.h +++ b/include/llvm/ADT/iterator.h @@ -97,14 +97,19 @@ struct iterator_facade_base /// This class can be used through CRTP to adapt one iterator into another. /// Typically this is done through providing in the derived class a custom \c /// operator* implementation. Other methods can be overridden as well. -template <typename DerivedT, typename WrappedIteratorT, typename T, - typename PointerT = T *, typename ReferenceT = T &, - // Don't provide these, they are mostly to act as aliases below. - typename WrappedTraitsT = std::iterator_traits<WrappedIteratorT>> +template < + typename DerivedT, typename WrappedIteratorT, + typename IteratorCategoryT = + typename std::iterator_traits<WrappedIteratorT>::iterator_category, + typename T = typename std::iterator_traits<WrappedIteratorT>::value_type, + typename DifferenceTypeT = + typename std::iterator_traits<WrappedIteratorT>::difference_type, + typename PointerT = T *, typename ReferenceT = T &, + // Don't provide these, they are mostly to act as aliases below. + typename WrappedTraitsT = std::iterator_traits<WrappedIteratorT>> class iterator_adaptor_base - : public iterator_facade_base< - DerivedT, typename WrappedTraitsT::iterator_category, T, - typename WrappedTraitsT::difference_type, PointerT, ReferenceT> { + : public iterator_facade_base<DerivedT, IteratorCategoryT, T, + DifferenceTypeT, PointerT, ReferenceT> { typedef typename iterator_adaptor_base::iterator_facade_base BaseT; protected: @@ -123,7 +128,7 @@ protected: : I(std::forward<U &&>(u)) {} public: - typedef typename WrappedTraitsT::difference_type difference_type; + typedef DifferenceTypeT difference_type; DerivedT &operator+=(difference_type n) { I += n; @@ -168,8 +173,10 @@ template <typename WrappedIteratorT, typename T = typename std::remove_reference< decltype(**std::declval<WrappedIteratorT>())>::type> struct pointee_iterator - : iterator_adaptor_base<pointee_iterator<WrappedIteratorT>, - WrappedIteratorT, T> { + : iterator_adaptor_base< + pointee_iterator<WrappedIteratorT>, WrappedIteratorT, + typename std::iterator_traits<WrappedIteratorT>::iterator_category, + T> { pointee_iterator() {} template <typename U> pointee_iterator(U &&u) diff --git a/include/llvm/Analysis/LazyCallGraph.h b/include/llvm/Analysis/LazyCallGraph.h index e406981952..7f9a43aba3 100644 --- a/include/llvm/Analysis/LazyCallGraph.h +++ b/include/llvm/Analysis/LazyCallGraph.h @@ -113,8 +113,9 @@ public: /// be scanned for "calls" or uses of functions and its child information /// will be constructed. All of these results are accumulated and cached in /// the graph. - class iterator : public iterator_adaptor_base< - iterator, NodeVectorImplT::iterator, Node> { + class iterator + : public iterator_adaptor_base<iterator, NodeVectorImplT::iterator, + std::random_access_iterator_tag, Node> { friend class LazyCallGraph; friend class LazyCallGraph::Node; diff --git a/include/llvm/IR/User.h b/include/llvm/IR/User.h index 453b6ad169..bc7696bdaf 100644 --- a/include/llvm/IR/User.h +++ b/include/llvm/IR/User.h @@ -131,8 +131,9 @@ public: /// Convenience iterator for directly iterating over the Values in the /// OperandList struct value_op_iterator - : iterator_adaptor_base<value_op_iterator, op_iterator, Value *, Value *, - Value *> { + : iterator_adaptor_base<value_op_iterator, op_iterator, + std::random_access_iterator_tag, Value *, + ptrdiff_t, Value *, Value *> { explicit value_op_iterator(Use *U = nullptr) : iterator_adaptor_base(U) {} Value *operator*() const { return *I; } |