any_iterator.h 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. //
  2. // any_iterator.h
  3. // stream
  4. //
  5. // Created by Sam Jaffe on 4/6/23.
  6. //
  7. #pragma once
  8. #include <iterator/facade.h>
  9. #include <stream/forward.h>
  10. #include <stream/detail/adaptor.h>
  11. namespace stream::ranges {
  12. template <typename T> class any_iterator : public facade<any_iterator<T>> {
  13. private:
  14. typename detail::adaptor<T>::dereference_t dereference_;
  15. typename detail::adaptor<T>::equal_to_t equal_to_;
  16. typename detail::adaptor<T>::increment_t increment_;
  17. std::shared_ptr<void> impl_{nullptr};
  18. public:
  19. template <typename It, typename IFD = detail::adaptor<T, It>>
  20. any_iterator(It impl)
  21. : dereference_(IFD::dereference()), equal_to_(IFD::equal_to()),
  22. increment_(IFD::increment()), impl_(std::make_shared<It>(impl)) {}
  23. T dereference() const { return dereference_(impl_.get()); }
  24. void increment() { increment_(impl_.get()); }
  25. bool equal_to(any_iterator const & other) const {
  26. return impl_ == other.impl_ ||
  27. (impl_ && other.impl_ && equal_to_(impl_.get(), other.impl_.get()));
  28. }
  29. };
  30. }