iterator.hpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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>
  12. class iterator : public ::iterator::facade<iterator<T>> {
  13. private:
  14. T (*dereference_)(void *){nullptr};
  15. bool (*equal_to_)(void *, void *){nullptr};
  16. void (*increment_)(void *){nullptr};
  17. char const * type_{nullptr};
  18. detail::ifd_pointer impl_{};
  19. public:
  20. iterator() = default;
  21. template <typename Iter>
  22. iterator(Iter impl)
  23. : dereference_([](void * p) -> T { return **((Iter *)p); }),
  24. equal_to_(
  25. [](void * l, void * r) { return *((Iter *)l) == *((Iter *)r); }),
  26. increment_([](void * p) { ++(*(Iter *)(p)); }),
  27. type_(typeid(Iter).name()), impl_(std::forward<Iter>(impl)) {}
  28. T dereference() const { return dereference_(impl_.get()); }
  29. void increment() { increment_(impl_.get()); }
  30. bool equal_to(iterator const & other) const {
  31. return impl_ == other.impl_ ||
  32. (impl_ && other.impl_ &&
  33. equal_to_(impl_.get(), other.impl_.get()));
  34. }
  35. };
  36. template <typename Iter>
  37. iterator(Iter) -> iterator<typename std::iterator_traits<Iter>::reference>;
  38. }
  39. MAKE_ITERATOR_FACADE_TYPEDEFS_T(::stream::iterator);