summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMehdi Amini <joker.eph@gmail.com>2019-06-21 05:43:08 +0000
committerMehdi Amini <joker.eph@gmail.com>2019-06-21 05:43:08 +0000
commitfc9aa33def002ad03f6f9102a2833e0476b5d7b5 (patch)
tree90a6e191d506a9a191a7e1dc1749d133f4b8c0a4
parentdc8de6037c3aceb9663c7433bb09584fa8571032 (diff)
downloadbcm5719-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.h7
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();
OpenPOWER on IntegriCloud