#include namespace pit{ template class passthrough{ T underlying; public: passthrough(T underlying): underlying(underlying){} passthrough(passthrough& from): underlying(from.underlying){} passthrough operator+(std::size_t amount){ return passthrough(this->underlying+amount); } void operator+=(std::size_t amount){ this->underlying += amount; } passthrough operator-(std::size_t amount){ return passthrough(this->underlying-amount); } void operator-=(std::size_t amount){ this->underlying -= amount; } T const& operator*(){ return this->underlying; } bool operator==(passthrough const& rhs){ return this->underlying == rhs.underlying; } }; template class range{ private: T beginning; T ending; public: range(T begin, T end):beginning(begin), ending(end){} passthrough begin(){ return passthrough(this->beginning); } passthrough end(){ return passthrough(this->ending); } }; template class repeat{ T val; public: // noops repeat operator+(std::size_t ){} repeat operator-(std::size_t ){} void operator+=(std::size_t ){} void operator-=(std::size_t ){} bool operator==(repeat const& rhs){return true;} T const& operator*(){ return this->val; } }; }