#pragma once #include #include "facade.h" namespace iterator { template ::iterator_category> class proxy; template class proxy : public facade { public: using single_pass_iterator = void; private: Iter impl_; public: proxy(Iter impl = {}) : impl_(impl) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } bool equal_to(proxy const & other) const { return impl_ == other.impl_; } protected: auto & impl() const { return impl_; } }; template class proxy : public facade { private: Iter impl_; public: proxy(Iter impl = {}) : impl_(impl) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } bool equal_to(proxy const & other) const { return impl_ == other.impl_; } protected: auto & impl() const { return impl_; } }; template class proxy : public facade { private: Iter impl_; public: proxy(Iter impl = {}) : impl_(impl) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } void decrement() { --impl_; } bool equal_to(proxy const & other) const { return impl_ == other.impl_; } protected: auto & impl() const { return impl_; } }; template class proxy : public facade { public: using difference_type = typename std::iterator_traits::difference_type; private: Iter impl_; public: proxy(Iter impl = {}) : impl_(impl) {} decltype(auto) dereference() const { return *impl_; } void advance(difference_type off) { impl_ += off; } difference_type distance_to(proxy const & other) const { return impl_ - other.impl_; } protected: auto & impl() const { return impl_; } }; }