iterator.hpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. //
  2. // iterator.hpp
  3. // stream
  4. //
  5. // Created by Sam Jaffe on 3/28/23.
  6. //
  7. #include "detail/ifd_pointer.hpp"
  8. #include <iterator/facade.h>
  9. namespace stream {
  10. template <typename T>
  11. 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 other) const {
  30. return equal_to_(impl_.get(), other.impl_.get());
  31. }
  32. };
  33. }
  34. MAKE_ITERATOR_FACADE_TYPEDEFS_T(::stream::iterator);