Index: llvm/include/llvm/ADT/STLExtras.h =================================================================== --- llvm/include/llvm/ADT/STLExtras.h +++ llvm/include/llvm/ADT/STLExtras.h @@ -285,15 +285,16 @@ template ()(*std::declval()))> + decltype(std::declval()(*std::declval())), + bool IsReference = std::is_reference::value> class mapped_iterator : public iterator_adaptor_base< - mapped_iterator, ItTy, - typename std::iterator_traits::iterator_category, - typename std::remove_reference::type> { + mapped_iterator, ItTy, + typename std::iterator_traits::iterator_category, + typename std::remove_reference::type> { public: mapped_iterator(ItTy U, FuncTy F) - : mapped_iterator::iterator_adaptor_base(std::move(U)), F(std::move(F)) {} + : mapped_iterator::iterator_adaptor_base(std::move(U)), F(std::move(F)) {} ItTy getCurrent() { return this->I; } @@ -303,6 +304,29 @@ FuncTy F; }; +template +class mapped_iterator()(*std::declval())), + false> + : public iterator_adaptor_base< + mapped_iterator, ItTy, + typename std::iterator_traits::iterator_category, + decltype(std::declval()(*std::declval()))> { +public: + mapped_iterator(ItTy U, FuncTy F) + : mapped_iterator::iterator_adaptor_base(std::move(U)), F(std::move(F)) {} + + ItTy getCurrent() { return this->I; } + + typename mapped_iterator::iterator_adaptor_base::reference operator*() const { + return V = F(*this->I); + } + +private: + FuncTy F; + mutable typename mapped_iterator::iterator_adaptor_base::value_type V; +}; + // map_iterator - Provide a convenient way to create mapped_iterators, just like // make_pair is useful for creating pairs... template