// // any_iterator.h // stream // // Created by Sam Jaffe on 4/6/23. // #pragma once #include #include #include namespace stream::ranges { template class any_iterator : public facade, iterator::category::forward> { private: typename detail::adaptor::dereference_t dereference_; typename detail::adaptor::equal_to_t equal_to_; typename detail::adaptor::increment_t increment_; std::shared_ptr impl_{nullptr}; public: template > any_iterator(It impl) : dereference_(IFD::dereference()), equal_to_(IFD::equal_to()), increment_(IFD::increment()), impl_(std::make_shared(impl)) {} T dereference() const { return dereference_(impl_.get()); } void increment() { increment_(impl_.get()); } bool equal_to(any_iterator const & other) const { return impl_ == other.impl_ || (impl_ && other.impl_ && equal_to_(impl_.get(), other.impl_.get())); } }; }