17#ifndef LIEF_ITERATORS_H
18#define LIEF_ITERATORS_H
45template<class T, typename U = typename decay_t<T>::value_type,
48 template<
class,
typename,
class>
55 using pointer = std::remove_pointer_t<U>*;
65 container_{std::forward<T>(other.container_)},
66 it_{std::begin(container_)},
67 distance_{other.distance_} {
68 std::advance(it_, distance_);
75 container_ = std::forward<T>(other.container_);
76 it_ = std::begin(other.container_);
77 distance_ = other.distance_;
78 std::advance(it_, distance_);
82 template<
class T2,
typename U2,
class IT2,
83 typename = std::enable_if_t<
84 !std::is_same_v<ref_iterator, ref_iterator<T2, U2, IT2>> &&
91 it_{std::
begin(container_)},
92 distance_{other.distance_} {
93 std::advance(it_, distance_);
96 template<
class T2,
typename U2,
class IT2,
97 typename = std::enable_if_t<
98 !std::is_same_v<ref_iterator, ref_iterator<T2, U2, IT2>> &&
104 std::forward<T2>(other.container_)
106 it_{std::begin(container_)},
107 distance_{other.distance_} {
108 std::advance(it_, distance_);
114 container_{std::forward<T>(container)},
115 it_(std::
begin(container_)) {}
118 container_{copy.container_},
119 it_{std::
begin(container_)},
120 distance_{copy.distance_} {
121 std::advance(it_, distance_);
134 std::swap(it_, other.it_);
135 std::swap(distance_, other.distance_);
140 it_ = std::next(it_);
152 if (it_ != std::begin(container_)) {
153 it_ = std::prev(it_);
169 std::advance(it_, movement);
170 distance_ += movement;
178 return (*
this) += -movement;
191 assert(n <
size() &&
"integrity error: out of bound");
196 std::distance(std::begin(no_const_this->container_), no_const_this->it_);
197 no_const_this->it_ = std::begin(no_const_this->container_);
198 std::advance(no_const_this->it_, n);
202 no_const_this->it_ = std::begin(no_const_this->container_);
203 std::advance(no_const_this->it_, saved_dist);
221 return distance_ - rhs.distance_;
225 return (rhs - *
this) > 0;
235 return !(*
this < rhs);
240 return !(*
this > rhs);
253 it.it_ = std::end(it.container_);
254 it.distance_ = it.
size();
263 return (
size() == other.
size() && distance_ == other.distance_);
267 return !(*
this == other);
271 return container_.size();
275 return container_.empty();
284 template<
typename V = DT_VAL>
286 assert(*it_ &&
"integrity error: nullptr");
290 template<
typename V = DT_VAL>
314template<class T, typename U = typename decay_t<T>::value_type,
315 class CT = std::add_const_t<T>>
321template<class T, typename U = typename decay_t<T>::value_type,
337 using filter_t = std::function<bool(
const typename DT::value_type&)>;
340 size_c_(other.size_c_),
341 size_cached_(other.size_cached_),
342 container_(std::forward<T>(other.container_)),
343 it_(std::begin(container_)),
344 filters_{std::move(other.filters_)},
345 distance_(other.distance_) {
346 std::advance(it_, distance_);
350 if (
this == &other) {
354 size_c_ = other.size_c_;
355 size_cached_ = other.size_cached_;
356 container_ = std::forward<T>(other.container_);
357 it_ = std::begin(container_);
358 filters_ = std::move(other.filters_);
359 distance_ = other.distance_;
361 std::advance(it_, distance_);
369 container_{std::forward<T>(container)},
370 it_(std::
begin(container_)),
374 filters_.push_back(filter);
376 if (it_ != std::end(container_)) {
377 if (!std::all_of(std::begin(filters_), std::end(filters_),
378 [
this](
const filter_t& f) {
return f(*it_); }))
386 container_{std::forward<T>(container)},
387 it_(std::
begin(container_)),
391 if (it_ != std::end(container_)) {
392 if (!std::all_of(std::begin(filters_), std::end(filters_),
393 [
this](
const filter_t& f) {
return f(*it_); }))
401 container_{std::forward<T>(container)},
402 it_(std::
begin(container_)),
406 container_{copy.container_},
407 it_{std::
begin(container_)},
408 filters_{copy.filters_},
409 distance_{copy.distance_} {
410 std::advance(it_, distance_);
421 std::swap(it_, other.it_);
422 std::swap(filters_, other.filters_);
423 std::swap(size_c_, other.size_c_);
424 std::swap(size_cached_, other.size_cached_);
425 std::swap(distance_, other.distance_);
430 filters_.push_back(func);
432 size_cached_ =
false;
448 return {container_, filters_};
459 it_end.it_ = it_end.container_.end();
460 it_end.distance_ = it_end.container_.size();
475 template<
typename V = DT_VAL>
477 assert(*it_ &&
"integrity error: nullptr");
481 template<
typename V = DT_VAL>
495 assert(n <
size() &&
"integrity error: out of bound");
514 if (filters_.empty()) {
515 return container_.size();
524 auto end_iter = it.
end();
525 for (; it != end_iter; ++it) {
535 if (filters_.empty()) {
536 return container_.empty();
548 return (container_.size() == other.container_.size() &&
549 distance_ == other.distance_);
553 return !(*
this == other);
558 if (it_ == std::end(container_)) {
559 distance_ = container_.size();
564 it_ = std::next(it_);
566 }
while (it_ != std::end(container_) &&
567 !std::all_of(std::begin(filters_), std::end(filters_),
568 [
this](
const filter_t& f) {
return f(*it_); }));
572 mutable size_t size_c_ = 0;
573 mutable bool size_cached_ =
false;
576 std::vector<filter_t> filters_;
581template<class T, typename U = typename decay_t<T>::value_type,
582 class CT = std::add_const_t<T>>
590template<
typename IteratorT>
598 begin_(std::forward<T>(it_begin)),
599 end_(std::forward<T>(it_end)) {}
608 return begin_ == end_;
611 class ReferenceProxy {
612 friend iterator_range;
617 it_(std::move(it)) {}
620 using reference =
decltype(*std::declval<const IteratorDecayTy&>());
626 template<
class It = IteratorDecayTy>
627 auto operator->() const -> decltype(&*std::declval<const It&>()) {
632 ReferenceProxy
at(
typename IteratorDecayTy::difference_type pos)
const {
633 static_assert(IsRandomAccess,
"at() needs random access iterator");
635 std::advance(it, pos);
636 return ReferenceProxy(std::move(it));
639 ReferenceProxy
operator[](
typename IteratorDecayTy::difference_type pos)
const {
644 return std::distance(begin_, end_);
650 std::is_base_of_v<std::random_access_iterator_tag,
651 typename IteratorDecayTy::iterator_category>,
653 std::is_base_of_v<std::bidirectional_iterator_tag,
654 typename IteratorDecayTy::iterator_category>,
669#if LIEF_HAS_STD_RANGES
670template<
typename IteratorT>
672 std::ranges::enable_borrowed_range<LIEF::iterator_range<IteratorT>> =
true;
735template<
typename DerivedT,
typename IteratorCategoryT,
typename T,
736 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT =
T*,
737 typename ReferenceT =
T&>
749 std::is_base_of_v<std::random_access_iterator_tag, IteratorCategoryT>,
751 std::is_base_of_v<std::bidirectional_iterator_tag, IteratorCategoryT>,
759 class ReferenceProxy {
764 ReferenceProxy(DerivedT I) :
768 operator ReferenceT()
const {
778 friend iterator_facade_base;
782 template<
typename RefT>
783 PointerProxy(RefT&& R) :
784 R(std::forward<RefT>(R)) {}
794 static_assert(std::is_base_of_v<iterator_facade_base, DerivedT>,
795 "Must pass the derived type to this template!");
796 static_assert(IsRandomAccess,
797 "The '+' operator is only defined for random access iterators.");
798 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
802 friend DerivedT
operator+(DifferenceTypeT n,
const DerivedT& i) {
803 static_assert(IsRandomAccess,
804 "The '+' operator is only defined for random access iterators.");
808 static_assert(IsRandomAccess,
809 "The '-' operator is only defined for random access iterators.");
810 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
816 static_assert(std::is_base_of_v<iterator_facade_base, DerivedT>,
817 "Must pass the derived type to this template!");
818 return static_cast<DerivedT*
>(
this)->
operator+=(1);
821 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
822 ++*
static_cast<DerivedT*
>(
this);
828 "The decrement operator is only defined for bidirectional iterators."
830 return static_cast<DerivedT*
>(
this)->
operator-=(1);
835 "The decrement operator is only defined for bidirectional iterators."
837 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
838 --*
static_cast<DerivedT*
>(
this);
842#ifndef __cpp_impl_three_way_comparison
844 return !(
static_cast<const DerivedT&
>(*this) == RHS);
851 "Relational operators are only defined for random access iterators."
853 return !(
static_cast<const DerivedT&
>(*this) < RHS) &&
854 !(
static_cast<const DerivedT&
>(*
this) == RHS);
859 "Relational operators are only defined for random access iterators."
861 return !(
static_cast<const DerivedT&
>(*this) > RHS);
866 "Relational operators are only defined for random access iterators."
868 return !(
static_cast<const DerivedT&
>(*this) < RHS);
872 return static_cast<const DerivedT*
>(
this)->
operator*();
875 static_assert(IsRandomAccess,
876 "Subscripting is only defined for random access iterators.");
877 return static_cast<const DerivedT*
>(
this)->
operator+(n);
886template<
typename DerivedT,
typename WrappedIteratorT,
887 typename IteratorCategoryT =
888 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
889 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
890 typename DifferenceTypeT =
891 typename std::iterator_traits<WrappedIteratorT>::difference_type,
892 typename PointerT = std::conditional_t<
893 std::is_same_v<T, typename std::iterator_traits<WrappedIteratorT>::
895 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
897 typename ReferenceT = std::conditional_t<
898 std::is_same_v<T, typename std::iterator_traits<WrappedIteratorT>::
900 typename std::iterator_traits<WrappedIteratorT>::reference, T&
902class iterator_adaptor_base
904 PointerT, ReferenceT> {
905 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
910 iterator_adaptor_base() =
default;
912 explicit iterator_adaptor_base(WrappedIteratorT u) :
914 static_assert(std::is_base_of_v<iterator_adaptor_base, DerivedT>,
915 "Must pass the derived type to this template!");
918 const WrappedIteratorT& wrapped()
const {
927 BaseT::IsRandomAccess,
928 "The '+=' operator is only defined for random access iterators."
931 return *
static_cast<DerivedT*
>(
this);
935 BaseT::IsRandomAccess,
936 "The '-=' operator is only defined for random access iterators."
939 return *
static_cast<DerivedT*
>(
this);
941 using BaseT::operator-;
943 static_assert(BaseT::IsRandomAccess,
944 "The '-' operator is only defined for random access iterators.");
950 using BaseT::operator++;
953 return *
static_cast<DerivedT*
>(
this);
955 using BaseT::operator--;
958 BaseT::IsBidirectional,
959 "The decrement operator is only defined for bidirectional iterators."
962 return *
static_cast<DerivedT*
>(
this);
966 const iterator_adaptor_base& RHS) {
967 return LHS.I == RHS.I;
970 const iterator_adaptor_base& RHS) {
972 BaseT::IsRandomAccess,
973 "Relational operators are only defined for random access iterators."
975 return LHS.I < RHS.I;
992template<
typename WrappedIteratorT,
994 std::remove_reference_t<decltype(**std::declval<WrappedIteratorT>())>>
996 : iterator_adaptor_base<
1001 template<
typename U>
1010template<
typename RangeT,
1011 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1012iterator_range<pointee_iterator<WrappedIteratorT>>
1015 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
1016 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
1019template<
typename WrappedIteratorT,
1020 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
1022 : public iterator_adaptor_base<
1035 return Ptr = &*this->I;
1039template<
typename RangeT,
1040 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1041iterator_range<pointer_iterator<WrappedIteratorT>>
1044 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
1045 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
1048template<
typename WrappedIteratorT,
1050 std::remove_reference_t<decltype(**std::declval<WrappedIteratorT>())>,
1051 typename T2 = std::add_pointer_t<T1>>
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:323
std::enable_if_t<!std::is_const_v< pointer_t >, pointer_t > operator->()
Definition iterators.hpp:503
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:547
filter_iterator(const filter_iterator ©)
Definition iterators.hpp:405
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:494
filter_iterator cend() const
Definition iterators.hpp:465
std::enable_if_t< std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:476
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:368
std::forward_iterator_tag iterator_category
Definition iterators.hpp:326
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator*()
Definition iterators.hpp:469
filter_iterator(T container)
Definition iterators.hpp:400
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:418
filter_iterator & operator++()
Definition iterators.hpp:436
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:385
filter_iterator end() const
Definition iterators.hpp:455
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:336
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:413
decay_t< Symbol * > value_type
Definition iterators.hpp:327
std::remove_pointer_t< Symbol * > * pointer
Definition iterators.hpp:329
typename filter_iterator::reference ref_t
Definition iterators.hpp:335
filter_iterator begin() const
Definition iterators.hpp:447
bool empty() const
Definition iterators.hpp:534
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator[](size_t n)
Definition iterators.hpp:488
Symbol * DT_VAL
Definition iterators.hpp:333
ptrdiff_t difference_type
Definition iterators.hpp:328
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:509
size_t size() const
Definition iterators.hpp:513
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:552
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:337
std::enable_if_t<!std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:482
std::remove_pointer_t< Symbol * > & reference
Definition iterators.hpp:330
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:339
symbols_t & container_type
Definition iterators.hpp:332
filter_iterator operator++(int)
Definition iterators.hpp:441
decay_t< symbols_t & > DT
Definition iterators.hpp:334
filter_iterator cbegin() const
Definition iterators.hpp:451
filter_iterator & def(filter_t func)
Definition iterators.hpp:429
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:349
DerivedT & operator++()
Definition iterators.hpp:951
DerivedT & operator--()
Definition iterators.hpp:956
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:933
ReferenceT operator*() const
Definition iterators.hpp:978
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:969
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:965
DifferenceTypeT difference_type
Definition iterators.hpp:923
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:925
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:942
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:738
DifferenceTypeT difference_type
Definition iterators.hpp:742
PointerProxy operator->() const
Definition iterators.hpp:871
DerivedT & operator--()
Definition iterators.hpp:825
DerivedT operator++(int)
Definition iterators.hpp:820
T value_type
Definition iterators.hpp:741
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:802
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:848
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:874
ReferenceT reference
Definition iterators.hpp:744
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:863
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:807
DerivedT & operator++()
Definition iterators.hpp:815
PointerT pointer
Definition iterators.hpp:743
DerivedT operator--(int)
Definition iterators.hpp:832
IteratorCategoryT iterator_category
Definition iterators.hpp:740
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:793
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:843
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:856
decltype(*std::declval< const IteratorDecayTy & >()) reference
Definition iterators.hpp:620
auto operator->() const -> decltype(&*std::declval< const It & >())
Definition iterators.hpp:627
Definition iterators.hpp:591
IteratorT begin() const
Definition iterators.hpp:601
ReferenceProxy at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:632
std::decay_t< assembly::Instruction::Iterator > IteratorDecayTy
Definition iterators.hpp:594
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:597
IteratorT end() const
Definition iterators.hpp:604
bool empty() const
Definition iterators.hpp:607
ReferenceProxy operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:639
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:593
std::ptrdiff_t size() const
Definition iterators.hpp:643
Definition iterators.hpp:1025
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:1034
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:1031
Iterator which returns reference on container's values.
Definition iterators.hpp:47
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:239
ref_iterator & operator--()
Definition iterators.hpp:151
size_t size() const
Definition iterators.hpp:270
ref_iterator & operator++()
Definition iterators.hpp:139
void swap(ref_iterator &other) noexcept
Definition iterators.hpp:129
bool operator<(const ref_iterator &rhs) const
Definition iterators.hpp:224
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:214
ref_iterator operator++(int)
Definition iterators.hpp:145
ref_iterator begin() const
Definition iterators.hpp:243
sections_t container_type
Definition iterators.hpp:58
typename ref_iterator::reference ref_t
Definition iterators.hpp:61
ref_iterator operator--(int)
Definition iterators.hpp:159
ref_iterator cend() const
Definition iterators.hpp:258
std::enable_if_t<!std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:291
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:166
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator[](size_t n)
Definition iterators.hpp:183
std::remove_pointer_t< typename decay_t< sections_t >::value_type > & reference
Definition iterators.hpp:56
std::bidirectional_iterator_tag iterator_category
Definition iterators.hpp:52
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator*()
Definition iterators.hpp:278
std::enable_if_t< std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:285
ref_iterator(ref_iterator &&other) noexcept
Definition iterators.hpp:64
ptrdiff_t difference_type
Definition iterators.hpp:54
ref_iterator operator+(typename ref_iterator::difference_type n) const
Definition iterators.hpp:208
ref_iterator cbegin() const
Definition iterators.hpp:247
bool empty() const
Definition iterators.hpp:274
ref_iterator & operator=(ref_iterator other)
Definition iterators.hpp:124
ref_iterator & operator=(ref_iterator &&other) noexcept
Definition iterators.hpp:71
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:266
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:229
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:234
ref_iterator(const ref_iterator ©)
Definition iterators.hpp:117
ref_iterator(ref_iterator< T2, U2, IT2 > &&other) noexcept
Definition iterators.hpp:102
ref_iterator end() const
Definition iterators.hpp:251
ref_iterator & operator-=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:175
ref_iterator(const ref_iterator< T2, U2, IT2 > &other)
Definition iterators.hpp:87
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:190
std::remove_pointer_t< typename decay_t< sections_t >::value_type > * pointer
Definition iterators.hpp:55
decay_t< typename decay_t< sections_t >::value_type > value_type
Definition iterators.hpp:53
std::enable_if_t<!std::is_const_v< pointer_t >, pointer_t > operator->()
Definition iterators.hpp:296
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:220
typename decay_t< sections_t >::value_type DT_VAL
Definition iterators.hpp:59
typename ref_iterator::pointer pointer_t
Definition iterators.hpp:62
friend class ref_iterator
Definition iterators.hpp:49
ref_iterator(T container)
Definition iterators.hpp:113
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:302
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:262
decay_t< sections_t > DT
Definition iterators.hpp:60
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
@ T
Definition AcceleratorCodes.hpp:97
LIEF namespace.
Definition Abstract/Binary.hpp:41
filter_iterator< CT, U, typename decay_t< CT >::const_iterator > const_filter_iterator
Iterator which returns a const ref on container's values given predicates.
Definition iterators.hpp:583
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:1013
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:663
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:1042
std::remove_const_t< T > remove_const_t
Definition iterators.hpp:38
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which returns a const ref on container's values.
Definition iterators.hpp:316
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:1052
std::decay_t< T > decay_t
Definition iterators.hpp:32
std::add_const_t< T > add_const_t
Definition iterators.hpp:35
std::add_lvalue_reference_t< T > add_lvalue_reference_t
Definition iterators.hpp:41
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:999
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:1005
pointee_iterator(U &&u)
Definition iterators.hpp:1002