// // iterator.hpp // stream // // Created by Sam Jaffe on 3/28/23. // #pragma once #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 const & other) const { return impl_ == other.impl_ || (impl_ && other.impl_ && equal_to_(impl_.get(), other.impl_.get())); } }; template iterator(Iter) -> iterator::reference>; } MAKE_ITERATOR_FACADE_TYPEDEFS_T(::stream::iterator);