diff options
Diffstat (limited to 'include/llvm/ADT/iterator.h')
| -rw-r--r-- | include/llvm/ADT/iterator.h | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/include/llvm/ADT/iterator.h b/include/llvm/ADT/iterator.h index 2898a677db37..0bd28d5c6cd0 100644 --- a/include/llvm/ADT/iterator.h +++ b/include/llvm/ADT/iterator.h @@ -155,7 +155,14 @@ template < typename T = typename std::iterator_traits<WrappedIteratorT>::value_type, typename DifferenceTypeT = typename std::iterator_traits<WrappedIteratorT>::difference_type, - typename PointerT = T *, typename ReferenceT = T &, + typename PointerT = typename std::conditional< + std::is_same<T, typename std::iterator_traits< + WrappedIteratorT>::value_type>::value, + typename std::iterator_traits<WrappedIteratorT>::pointer, T *>::type, + typename ReferenceT = typename std::conditional< + std::is_same<T, typename std::iterator_traits< + WrappedIteratorT>::value_type>::value, + typename std::iterator_traits<WrappedIteratorT>::reference, T &>::type, // Don't provide these, they are mostly to act as aliases below. typename WrappedTraitsT = std::iterator_traits<WrappedIteratorT>> class iterator_adaptor_base @@ -168,15 +175,7 @@ protected: iterator_adaptor_base() = default; - template <typename U> - explicit iterator_adaptor_base( - U &&u, - typename std::enable_if< - !std::is_base_of<typename std::remove_cv< - typename std::remove_reference<U>::type>::type, - DerivedT>::value, - int>::type = 0) - : I(std::forward<U &&>(u)) {} + explicit iterator_adaptor_base(WrappedIteratorT u) : I(std::move(u)) {} const WrappedIteratorT &wrapped() const { return I; } |
