iterator.hpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. //
  2. // iterator.hpp
  3. // stream
  4. //
  5. // Created by Sam Jaffe on 3/28/23.
  6. //
  7. #pragma once
  8. #include "detail/ifd_pointer.hpp"
  9. #include <iterator/facade.h>
  10. namespace stream {
  11. template <typename T> class iterator : public ::iterator::facade<iterator<T>> {
  12. private:
  13. T (*dereference_)(void *){nullptr};
  14. bool (*equal_to_)(void *, void *){nullptr};
  15. void (*increment_)(void *){nullptr};
  16. char const * type_{nullptr};
  17. detail::ifd_pointer impl_{};
  18. public:
  19. iterator() = default;
  20. template <typename Iter>
  21. iterator(Iter impl)
  22. : dereference_([](void * p) -> T { return **((Iter *)p); }),
  23. equal_to_(
  24. [](void * l, void * r) { return *((Iter *)l) == *((Iter *)r); }),
  25. increment_([](void * p) { ++(*(Iter *)(p)); }),
  26. type_(typeid(Iter).name()), impl_(std::forward<Iter>(impl)) {}
  27. T dereference() const { return dereference_(impl_.get()); }
  28. void increment() { increment_(impl_.get()); }
  29. bool equal_to(iterator const & other) const {
  30. return impl_ == other.impl_ ||
  31. (impl_ && other.impl_ && equal_to_(impl_.get(), other.impl_.get()));
  32. }
  33. };
  34. template <typename Iter>
  35. iterator(Iter) -> iterator<typename std::iterator_traits<Iter>::reference>;
  36. }
  37. MAKE_ITERATOR_FACADE_TYPEDEFS_T(::stream::iterator);