// // iterator.hpp // stream // // Created by Sam Jaffe on 3/28/23. // #include "detail/ifd_pointer.hpp" #include namespace stream { template class iterator : public ::iterator::facade> { private: T (*dereference_)(void *){nullptr}; bool (*equal_to_)(void *, void *){nullptr}; void (*increment_)(void *){nullptr}; char const * type_{nullptr}; detail::ifd_pointer impl_{}; public: iterator() = default; template iterator(Iter impl) : dereference_([](void * p) -> T { return **((Iter *)p); }), equal_to_( [](void * l, void * r) { return *((Iter *)l) == *((Iter *)r); }), increment_([](void * p) { ++(*(Iter *)(p)); }), type_(typeid(Iter).name()), impl_(std::forward(impl)) {} T dereference() const { return dereference_(impl_.get()); } void increment() { increment_(impl_.get()); } bool equal_to(iterator other) const { return equal_to_(impl_.get(), other.impl_.get()); } }; } MAKE_ITERATOR_FACADE_TYPEDEFS_T(::stream::iterator);