#ifndef _TRANSFORMADAPTER_H #define _TRANSFORMADAPTER_H // // This file is distributed under the MIT License. See LICENSE.md for details. // // Standard includes #include // Local includes #include "range.h" #include "iteratorwrapper.h" template class TransformIterator : public IteratorWrapper { private: using base = IteratorWrapper; public: using value_type = NewType; using reference = NewType; using pointer = typename base::pointer; using difference_type = typename base::difference_type; using transformer = std::function; public: TransformIterator(Wrapped Iterator, transformer F) : IteratorWrapper(Iterator), F(F) { } reference operator*() const { return F(base::operator*()); } pointer operator->() const = delete; reference operator[](const difference_type& n) const { return F(base::operator[](n)); } private: transformer F; }; namespace adaptors { template class Transform { public: using transformer = typename TransformIterator::transformer; Transform(transformer Transformer) : Transformer(Transformer) { } template Range> transform(Range Input) { return Range>(TransformIterator(Input.begin(), Transformer), TransformIterator(Input.end(), Transformer)); } private: transformer Transformer; }; } template struct function_traits : public function_traits { }; template struct function_traits { using return_type = ReturnType; }; template using TransformFunction = std::function; template auto operator|(Range Input, R Transformer) -> Range::return_type, I>> { return adaptors::Transform::return_type, I>(Transformer).transform(Input); } template auto operator|(C Input, R Transformer) -> Range::return_type, typename C::iterator>> { return adaptors::Transform::return_type, typename C::iterator>(Transformer).transform(make_range(Input)); } // template // Range> // operator|(C Input, TransformFunction Function) { // adaptors::Transform Transformer(Function); // return Transformer.transform(make_range(Input)); // } #endif // _TRANSFORMADAPTER_H