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