#include namespace pit{ template class lazy_transform{ private: std::function transformation; InputIt start; InputIt ending; public: class iterator{ private: InputIt underlying; std::function transformation; iterator(InputIt u,std::function transformation ):underlying(u), transformation(transformation){} public: iterator operator+(std::size_t amount){ return iterator(this->underlying+amount); } void operator+=(std::size_t amount){ this->underlying += amount; } iterator operator-(std::size_t amount){ return iterator(this->underlying-amount); } void operator-=(std::size_t amount){ this->underlying -= amount; } bool operator==(iterator const& rhs){ return this->underlying == rhs.underlying; } OutputType operator*(){ return transformation(*underlying); } }; lazy_transform(InputIt start, InputIt end, std::function transformation):start(start), ending(end), transformation(transformation){} iterator begin(){ return iterator(start); } iterator end(){ return iterator(ending); } }; template class lazy_filter{ private: std::function filter; InputIt start; InputIt ending; public: class iterator{ private: InputIt underlying; InputIt ending; std::function filter; iterator(InputIt point, InputIt ending,std::function filter ):underlying(u), filter(filter){} public: iterator operator+(std::size_t amount){ return iterator(this->underlying+amount); } void operator+=(std::size_t amount){ this->underlying += amount; } iterator operator-(std::size_t amount){ return iterator(this->underlying-amount); } void operator-=(std::size_t amount){ this->underlying -= amount; } bool operator==(iterator const& rhs){ return this->underlying == rhs.underlying; } InputType operator*(){ return *underlying; } }; lazy_filter(InputIt start, InputIt end, std::function filter):start(start), ending(end), filter(filter){} iterator begin(){ return iterator(start); } iterator end(){ return iterator(ending); } }; }