#pragma once #include #include #include namespace iterator { template class proxy : public facade { public: using single_pass_iterator = void; private: It impl_; public: proxy() = default; proxy(It impl) : impl_(impl) {} template proxy(Args &&... args) : impl_(FWD(args)...) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } bool equal_to(Self const & other) const { return impl_ == other.impl_; } SFINAE(detail::has_sentinel_type_v) bool at_end() const { return impl() == typename It::sentinel_type(); } protected: auto impl() const { return impl_; } }; template class proxy : public facade { private: It impl_; public: proxy() = default; proxy(It impl) : impl_(impl) {} template proxy(Args &&... args) : impl_(FWD(args)...) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } bool equal_to(Self const & other) const { return impl_ == other.impl_; } SFINAE(detail::has_sentinel_type_v) bool at_end() const { return impl() == typename It::sentinel_type(); } protected: auto impl() const { return impl_; } }; template class proxy : public facade { private: It impl_; public: proxy() = default; proxy(It impl) : impl_(impl) {} template proxy(Args &&... args) : impl_(FWD(args)...) {} decltype(auto) dereference() const { return *impl_; } void increment() { ++impl_; } void decrement() { --impl_; } bool equal_to(Self const & other) const { return impl_ == other.impl_; } SFINAE(detail::has_sentinel_type_v) bool at_end() const { return impl() == typename It::sentinel_type(); } protected: auto impl() const { return impl_; } }; template class proxy : public facade { public: using difference_type = typename std::iterator_traits::difference_type; private: It impl_; public: proxy() = default; proxy(It impl) : impl_(impl) {} template proxy(Args &&... args) : impl_(FWD(args)...) {} decltype(auto) dereference() const { return *impl_; } void advance(difference_type off) { impl_ += off; } difference_type distance_to(Self const & other) const { return other.impl_ - impl_; } SFINAE(detail::has_sentinel_type_v) bool at_end() const { return impl() == typename It::sentinel_type(); } protected: auto impl() const { return impl_; } }; } #include