]> granicus.if.org Git - llvm/commitdiff
Use std::iterator_traits to infer result type of llvm::enumerate iterator wrapper
authorMehdi Amini <joker.eph@gmail.com>
Fri, 21 Jun 2019 05:43:08 +0000 (05:43 +0000)
committerMehdi Amini <joker.eph@gmail.com>
Fri, 21 Jun 2019 05:43:08 +0000 (05:43 +0000)
Update the llvm::enumerate helper class result_pair<R> to use the 'iterator_traits<R>::reference'
type as the result of 'value()' instead 'ValueOfRange<R> &'. This enables support for iterators
that return value types, i.e. non reference. This is a common pattern for some classes of
iterators, e.g. mapped_iterator.

Patch by: River Riddle <riverriddle@google.com>

Differential Revision: https://reviews.llvm.org/D63632

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

include/llvm/ADT/STLExtras.h

index eb9dff3efeda2ff2c1500f0a8273d7261eaab9e8..de82f2bce7f84a6b654f19854dde8c1bd59e242b 100644 (file)
@@ -1506,6 +1506,9 @@ namespace detail {
 template <typename R> class enumerator_iter;
 
 template <typename R> struct result_pair {
+  using value_reference =
+      typename std::iterator_traits<IterOfRange<R>>::reference;
+
   friend class enumerator_iter<R>;
 
   result_pair() = default;
@@ -1519,8 +1522,8 @@ template <typename R> struct result_pair {
   }
 
   std::size_t index() const { return Index; }
-  const ValueOfRange<R> &value() const { return *Iter; }
-  ValueOfRange<R> &value() { return *Iter; }
+  const value_reference value() const { return *Iter; }
+  value_reference value() { return *Iter; }
 
 private:
   std::size_t Index = std::numeric_limits<std::size_t>::max();