Go to the documentation of this file.
9 #ifndef EAGINE_ANY_ITERATOR_HPP
10 #define EAGINE_ANY_ITERATOR_HPP
23 template <
typename VT,
typename RT,
typename PT,
typename DT>
41 template <
typename Iter>
43 : _pimpl{make_deep_copy_ptr<_impl<Iter>>(i)} {}
48 return a._pimpl->_equal(b._pimpl.get());
54 return !a._pimpl->_equal(b._pimpl.get());
59 return _pimpl->_deref();
77 virtual std::unique_ptr<_intf> copy() = 0;
78 virtual RT _deref() = 0;
79 virtual void _advance() = 0;
80 virtual bool _equal(_intf*) = 0;
83 template <
typename Iter>
84 struct _impl : _intf {
90 std::unique_ptr<_intf> copy()
override {
91 return std::unique_ptr<_intf>(
new _impl(*
this));
94 RT _deref()
override {
98 void _advance()
override {
102 bool _equal(_intf* intf)
override {
103 auto* that =
dynamic_cast<_impl*
>(intf);
104 EAGINE_ASSERT(that !=
nullptr);
105 return this->_i == that->_i;
109 deep_copy_ptr<_intf> _pimpl;
114 template <
typename T>
118 template <
typename T>
123 template <
typename VT,
typename RT,
typename PT,
typename DT>
124 class any_forward_iterator_range {
131 any_forward_iterator_range(iterator b, iterator e)
133 , _end(std::move(e)) {}
135 template <
typename Range>
136 any_forward_iterator_range(
const Range& range)
137 : any_forward_iterator_range(range.begin(), range.end()) {}
139 iterator begin()
const {
143 iterator end()
const {
148 template <
typename T>
149 using any_std_forward_range =
150 any_forward_iterator_range<T, const T&, const T*, std::ptrdiff_t>;
152 template <
typename T>
153 using any_copying_forward_range =
154 any_forward_iterator_range<T, T, const T*, std::ptrdiff_t>;
158 #endif // EAGINE_ANY_ITERATOR_HPP
reference operator*() const
Dereference operator.
Definition: any_iterator.hpp:58
VT value_type
Alias for value type.
Definition: any_iterator.hpp:27
friend bool operator!=(const any_forward_iterator &a, const any_forward_iterator &b)
Non-equality comparison.
Definition: any_iterator.hpp:53
Common code is placed in this namespace.
Definition: eagine.hpp:21
any_forward_iterator< T, const T &, const T *, std::ptrdiff_t > any_std_forward_iterator
Alias for type erased STL forward iterators.
Definition: any_iterator.hpp:116
std::forward_iterator_tag iterator_category
Iterator category.
Definition: any_iterator.hpp:39
Template used to construct tag-types used mostly in tag-dispatching.
Definition: selector.hpp:21
any_forward_iterator & operator++()
Pre-increment.
Definition: any_iterator.hpp:63
Base template for abstract interfaces, implements common functionality.
Definition: interface.hpp:18
const any_forward_iterator operator++(int)
Post-increment.
Definition: any_iterator.hpp:69
PT pointer
Alias for pointer type.
Definition: any_iterator.hpp:33
Type erasure for forward iterators.
Definition: any_iterator.hpp:24
friend bool operator==(const any_forward_iterator &a, const any_forward_iterator &b)
Equality comparison.
Definition: any_iterator.hpp:47
DT difference_type
Alias fro difference type.
Definition: any_iterator.hpp:36
RT reference
Alias for reference type.
Definition: any_iterator.hpp:30