any_iterator.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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>
  13. class any_iterator
  14. : public facade<any_iterator<T>, iterator::category::forward> {
  15. private:
  16. typename detail::adaptor<T>::dereference_t dereference_;
  17. typename detail::adaptor<T>::equal_to_t equal_to_;
  18. typename detail::adaptor<T>::increment_t increment_;
  19. std::shared_ptr<void> impl_{nullptr};
  20. public:
  21. template <typename It, typename IFD = detail::adaptor<T, It>>
  22. any_iterator(It impl)
  23. : dereference_(IFD::dereference()), equal_to_(IFD::equal_to()),
  24. increment_(IFD::increment()), impl_(std::make_shared<It>(impl)) {}
  25. T dereference() const { return dereference_(impl_.get()); }
  26. void increment() { increment_(impl_.get()); }
  27. bool equal_to(any_iterator const & other) const {
  28. return impl_ == other.impl_ ||
  29. (impl_ && other.impl_ && equal_to_(impl_.get(), other.impl_.get()));
  30. }
  31. };
  32. }