diff options
| author | Mehdi Amini <joker.eph@gmail.com> | 2019-06-21 05:43:08 +0000 |
|---|---|---|
| committer | Mehdi Amini <joker.eph@gmail.com> | 2019-06-21 05:43:08 +0000 |
| commit | fc9aa33def002ad03f6f9102a2833e0476b5d7b5 (patch) | |
| tree | 90a6e191d506a9a191a7e1dc1749d133f4b8c0a4 | |
| parent | dc8de6037c3aceb9663c7433bb09584fa8571032 (diff) | |
| download | bcm5719-llvm-fc9aa33def002ad03f6f9102a2833e0476b5d7b5.tar.gz bcm5719-llvm-fc9aa33def002ad03f6f9102a2833e0476b5d7b5.zip | |
Use std::iterator_traits to infer result type of llvm::enumerate iterator wrapper
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
llvm-svn: 364007
| -rw-r--r-- | llvm/include/llvm/ADT/STLExtras.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index eb9dff3efed..de82f2bce7f 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -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(); |

