#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) {} template proxy(Args &&... args) : impl_(std::forward(args)...) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } bool equal_to(Self 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) {} template proxy(Args &&... args) : impl_(std::forward(args)...) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } bool equal_to(Self 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) {} template proxy(Args &&... args) : impl_(std::forward(args)...) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } void decrement() { --impl_; } bool equal_to(Self 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) {} template proxy(Args &&... args) : impl_(std::forward(args)...) {} decltype(auto) dereference() const { return *impl_; } void advance(difference_type off) { impl_ += off; } // This shouldn't need to be implemented, but for some reason my traits // are not correctly deducing here. bool equal_to(Self const & other) const { return distance_to(other) == 0; } difference_type distance_to(Self const & other) const { return other.impl_ - impl_; } protected: auto & impl() const { return impl_; } }; }