| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- //
- // iterator.hpp
- // stream
- //
- // Created by Sam Jaffe on 3/28/23.
- //
- #pragma once
- #include "detail/ifd_pointer.hpp"
- #include <iterator/facade.h>
- namespace stream {
- template <typename T>
- class iterator : public ::iterator::facade<iterator<T>> {
- 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 <typename Iter>
- 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<Iter>(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 <typename Iter>
- iterator(Iter) -> iterator<typename std::iterator_traits<Iter>::reference>;
- }
- MAKE_ITERATOR_FACADE_TYPEDEFS_T(::stream::iterator);
|