17#ifndef LIEF_ITERATORS_H
18#define LIEF_ITERATORS_H
30using decay_t =
typename std::decay<T>::type;
43template<class T, typename U = typename decay_t<T>::value_type,
46 template<
class,
typename,
class>
53 using pointer =
typename std::remove_pointer<U>::type*;
54 using reference =
typename std::remove_pointer<U>::type&;
63 container_{std::forward<T>(other.container_)},
64 it_{std::begin(container_)},
65 distance_{other.distance_} {
66 std::advance(it_, distance_);
73 container_ = std::forward<T>(other.container_);
74 it_ = std::begin(other.container_);
75 distance_ = other.distance_;
76 std::advance(it_, distance_);
80 template<
class T2,
typename U2,
class IT2,
81 typename =
typename std::enable_if<
82 !std::is_same<ref_iterator, ref_iterator<T2, U2, IT2>>::value &&
89 it_{std::
begin(container_)},
90 distance_{other.distance_} {
91 std::advance(it_, distance_);
94 template<
class T2,
typename U2,
class IT2,
95 typename =
typename std::enable_if<
96 !std::is_same<ref_iterator, ref_iterator<T2, U2, IT2>>::value &&
102 std::forward<T2>(other.container_)
104 it_{std::begin(container_)},
105 distance_{other.distance_} {
106 std::advance(it_, distance_);
112 container_{std::forward<T>(container)},
113 it_(std::
begin(container_)) {}
116 container_{copy.container_},
117 it_{std::
begin(container_)},
118 distance_{copy.distance_} {
119 std::advance(it_, distance_);
132 std::swap(it_, other.it_);
133 std::swap(distance_, other.distance_);
138 it_ = std::next(it_);
150 if (it_ != std::begin(container_)) {
151 it_ = std::prev(it_);
166 std::advance(it_, movement);
167 distance_ += movement;
174 return (*
this) += -movement;
178 typename std::enable_if<!std::is_const<ref_t>::value,
188 assert(n <
size() &&
"integrity error: out of bound");
193 std::distance(std::begin(no_const_this->container_), no_const_this->it_);
194 no_const_this->it_ = std::begin(no_const_this->container_);
195 std::advance(no_const_this->it_, n);
199 no_const_this->it_ = std::begin(no_const_this->container_);
200 std::advance(no_const_this->it_, saved_dist);
218 return distance_ - rhs.distance_;
222 return (rhs - *
this) > 0;
232 return !(*
this < rhs);
237 return !(*
this > rhs);
250 it.it_ = std::end(it.container_);
251 it.distance_ = it.
size();
260 return (
size() == other.
size() && distance_ == other.distance_);
264 return !(*
this == other);
268 return container_.size();
272 return container_.empty();
275 typename std::enable_if<!std::is_const<ref_t>::value,
283 template<
typename V = DT_VAL>
286 assert(*it_ &&
"integrity error: nullptr");
290 template<
typename V = DT_VAL>
297 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
316template<class T, typename U = typename decay_t<T>::value_type,
317 class CT =
typename std::add_const<T>::type>
323template<class T, typename U = typename decay_t<T>::value_type,
331 using pointer =
typename std::remove_pointer<U>::type*;
332 using reference =
typename std::remove_pointer<U>::type&;
339 using filter_t = std::function<bool(
const typename DT::value_type&)>;
342 size_c_(other.size_c_),
343 size_cached_(other.size_cached_),
344 container_(std::forward<T>(other.container_)),
345 it_(std::begin(container_)),
346 filters_{std::move(other.filters_)},
347 distance_(other.distance_) {
348 std::advance(it_, distance_);
352 if (
this == &other) {
356 size_c_ = other.size_c_;
357 size_cached_ = other.size_cached_;
358 container_ = std::forward<T>(other.container_);
359 it_ = std::begin(container_);
360 filters_ = std::move(other.filters_);
361 distance_ = other.distance_;
363 std::advance(it_, distance_);
371 container_{std::forward<T>(container)},
372 it_(std::
begin(container_)),
376 filters_.push_back(filter);
378 if (it_ != std::end(container_)) {
379 if (!std::all_of(std::begin(filters_), std::end(filters_),
380 [
this](
const filter_t& f) {
return f(*it_); }))
388 container_{std::forward<T>(container)},
389 it_(std::
begin(container_)),
393 if (it_ != std::end(container_)) {
394 if (!std::all_of(std::begin(filters_), std::end(filters_),
395 [
this](
const filter_t& f) {
return f(*it_); }))
403 container_{std::forward<T>(container)},
404 it_(std::
begin(container_)),
408 container_{copy.container_},
409 it_{std::
begin(container_)},
410 filters_{copy.filters_},
411 distance_{copy.distance_} {
412 std::advance(it_, distance_);
423 std::swap(it_, other.it_);
424 std::swap(filters_, other.filters_);
425 std::swap(size_c_, other.size_c_);
426 std::swap(size_cached_, other.size_cached_);
427 std::swap(distance_, other.distance_);
432 filters_.push_back(func);
434 size_cached_ =
false;
450 return {container_, filters_};
461 it_end.it_ = it_end.container_.end();
462 it_end.distance_ = it_end.container_.size();
471 typename std::enable_if<!std::is_const<ref_t>::value,
479 template<
typename V = DT_VAL>
482 assert(*it_ &&
"integrity error: nullptr");
486 template<
typename V = DT_VAL>
493 typename std::enable_if<!std::is_const<ref_t>::value,
502 assert(n <
size() &&
"integrity error: out of bound");
510 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
522 if (filters_.empty()) {
523 return container_.size();
532 auto end_iter = it.
end();
533 for (; it != end_iter; ++it) {
543 if (filters_.empty()) {
544 return container_.empty();
556 return (container_.size() == other.container_.size() &&
557 distance_ == other.distance_);
561 return !(*
this == other);
566 if (it_ == std::end(container_)) {
567 distance_ = container_.size();
572 it_ = std::next(it_);
574 }
while (it_ != std::end(container_) &&
575 !std::all_of(std::begin(filters_), std::end(filters_),
576 [
this](
const filter_t& f) {
return f(*it_); }));
580 mutable size_t size_c_ = 0;
581 mutable bool size_cached_ =
false;
584 std::vector<filter_t> filters_;
589template<class T, typename U = typename decay_t<T>::value_type,
590 class CT =
typename std::add_const<T>::type>
598template<
typename IteratorT>
606 begin_(std::forward<T>(it_begin)),
607 end_(std::forward<T>(it_end)) {}
616 return begin_ == end_;
619 typename IteratorDecayTy::value_type
620 at(
typename IteratorDecayTy::difference_type pos)
const {
621 static_assert(IsRandomAccess,
"at() needs random access iterator");
623 std::advance(it, pos);
627 typename IteratorDecayTy::value_type
628 operator[](
typename IteratorDecayTy::difference_type pos)
const {
633 return std::distance(begin_, end_);
639 std::is_base_of<std::random_access_iterator_tag,
640 typename IteratorDecayTy::iterator_category>::value,
642 std::is_base_of<std::bidirectional_iterator_tag,
643 typename IteratorDecayTy::iterator_category>::value,
714template<
typename DerivedT,
typename IteratorCategoryT,
typename T,
715 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT = T*,
716 typename ReferenceT = T&>
728 std::is_base_of<std::random_access_iterator_tag, IteratorCategoryT>::value,
730 std::is_base_of<std::bidirectional_iterator_tag, IteratorCategoryT>::value,
738 class ReferenceProxy {
743 ReferenceProxy(DerivedT I) :
747 operator ReferenceT()
const {
757 friend iterator_facade_base;
761 template<
typename RefT>
762 PointerProxy(RefT&& R) :
763 R(std::forward<RefT>(R)) {}
773 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
774 "Must pass the derived type to this template!");
775 static_assert(IsRandomAccess,
776 "The '+' operator is only defined for random access iterators.");
777 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
781 friend DerivedT
operator+(DifferenceTypeT n,
const DerivedT& i) {
782 static_assert(IsRandomAccess,
783 "The '+' operator is only defined for random access iterators.");
787 static_assert(IsRandomAccess,
788 "The '-' operator is only defined for random access iterators.");
789 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
795 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
796 "Must pass the derived type to this template!");
797 return static_cast<DerivedT*
>(
this)->
operator+=(1);
800 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
801 ++*
static_cast<DerivedT*
>(
this);
807 "The decrement operator is only defined for bidirectional iterators."
809 return static_cast<DerivedT*
>(
this)->
operator-=(1);
814 "The decrement operator is only defined for bidirectional iterators."
816 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
817 --*
static_cast<DerivedT*
>(
this);
821#ifndef __cpp_impl_three_way_comparison
823 return !(
static_cast<const DerivedT&
>(*this) == RHS);
830 "Relational operators are only defined for random access iterators."
832 return !(
static_cast<const DerivedT&
>(*this) < RHS) &&
833 !(
static_cast<const DerivedT&
>(*
this) == RHS);
838 "Relational operators are only defined for random access iterators."
840 return !(
static_cast<const DerivedT&
>(*this) > RHS);
845 "Relational operators are only defined for random access iterators."
847 return !(
static_cast<const DerivedT&
>(*this) < RHS);
851 return static_cast<const DerivedT*
>(
this)->
operator*();
854 static_assert(IsRandomAccess,
855 "Subscripting is only defined for random access iterators.");
856 return static_cast<const DerivedT*
>(
this)->
operator+(n);
865template<
typename DerivedT,
typename WrappedIteratorT,
866 typename IteratorCategoryT =
867 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
868 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
869 typename DifferenceTypeT =
870 typename std::iterator_traits<WrappedIteratorT>::difference_type,
871 typename PointerT =
typename std::conditional<
872 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
874 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
876 typename ReferenceT =
typename std::conditional<
877 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
879 typename std::iterator_traits<WrappedIteratorT>::reference, T&
881class iterator_adaptor_base
883 PointerT, ReferenceT> {
884 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
889 iterator_adaptor_base() =
default;
891 explicit iterator_adaptor_base(WrappedIteratorT u) :
893 static_assert(std::is_base_of<iterator_adaptor_base, DerivedT>::value,
894 "Must pass the derived type to this template!");
897 const WrappedIteratorT& wrapped()
const {
906 BaseT::IsRandomAccess,
907 "The '+=' operator is only defined for random access iterators."
910 return *
static_cast<DerivedT*
>(
this);
914 BaseT::IsRandomAccess,
915 "The '-=' operator is only defined for random access iterators."
918 return *
static_cast<DerivedT*
>(
this);
920 using BaseT::operator-;
922 static_assert(BaseT::IsRandomAccess,
923 "The '-' operator is only defined for random access iterators.");
929 using BaseT::operator++;
932 return *
static_cast<DerivedT*
>(
this);
934 using BaseT::operator--;
937 BaseT::IsBidirectional,
938 "The decrement operator is only defined for bidirectional iterators."
941 return *
static_cast<DerivedT*
>(
this);
945 const iterator_adaptor_base& RHS) {
946 return LHS.I == RHS.I;
949 const iterator_adaptor_base& RHS) {
951 BaseT::IsRandomAccess,
952 "Relational operators are only defined for random access iterators."
954 return LHS.I < RHS.I;
971template<
typename WrappedIteratorT,
972 typename T =
typename std::
973 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type>
975 : iterator_adaptor_base<
989template<
typename RangeT,
990 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
991iterator_range<pointee_iterator<WrappedIteratorT>>
994 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
995 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
998template<
typename WrappedIteratorT,
999 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
1001 : public iterator_adaptor_base<
1014 return Ptr = &*this->I;
1018template<
typename RangeT,
1019 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1020iterator_range<pointer_iterator<WrappedIteratorT>>
1023 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
1024 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
1027template<
typename WrappedIteratorT,
1028 typename T1 =
typename std::
1029 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type,
1030 typename T2 =
typename std::add_pointer<T1>::type>
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:325
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:488
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:555
filter_iterator(const filter_iterator ©)
Definition iterators.hpp:407
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:501
filter_iterator cend() const
Definition iterators.hpp:467
typename std::remove_pointer< Symbol * >::type * pointer
Definition iterators.hpp:331
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:370
std::forward_iterator_tag iterator_category
Definition iterators.hpp:328
filter_iterator(T container)
Definition iterators.hpp:402
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:420
filter_iterator & operator++()
Definition iterators.hpp:438
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:511
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:387
filter_iterator end() const
Definition iterators.hpp:457
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:338
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:415
decay_t< Symbol * > value_type
Definition iterators.hpp:329
typename filter_iterator::reference ref_t
Definition iterators.hpp:337
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:473
filter_iterator begin() const
Definition iterators.hpp:449
bool empty() const
Definition iterators.hpp:542
Symbol * DT_VAL
Definition iterators.hpp:335
ptrdiff_t difference_type
Definition iterators.hpp:330
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:517
size_t size() const
Definition iterators.hpp:521
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:481
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:560
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:339
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:341
symbols_t & container_type
Definition iterators.hpp:334
filter_iterator operator++(int)
Definition iterators.hpp:443
decay_t< symbols_t & > DT
Definition iterators.hpp:336
filter_iterator cbegin() const
Definition iterators.hpp:453
filter_iterator & def(filter_t func)
Definition iterators.hpp:431
typename std::remove_pointer< Symbol * >::type & reference
Definition iterators.hpp:332
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:351
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:495
DerivedT & operator++()
Definition iterators.hpp:930
DerivedT & operator--()
Definition iterators.hpp:935
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:912
ReferenceT operator*() const
Definition iterators.hpp:957
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:948
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:944
DifferenceTypeT difference_type
Definition iterators.hpp:902
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:904
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:921
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:717
DifferenceTypeT difference_type
Definition iterators.hpp:721
PointerProxy operator->() const
Definition iterators.hpp:850
DerivedT & operator--()
Definition iterators.hpp:804
DerivedT operator++(int)
Definition iterators.hpp:799
T value_type
Definition iterators.hpp:720
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:781
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:827
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:853
ReferenceT reference
Definition iterators.hpp:723
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:842
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:786
DerivedT & operator++()
Definition iterators.hpp:794
PointerT pointer
Definition iterators.hpp:722
DerivedT operator--(int)
Definition iterators.hpp:811
IteratorCategoryT iterator_category
Definition iterators.hpp:719
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:772
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:822
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:835
Definition iterators.hpp:599
IteratorT begin() const
Definition iterators.hpp:609
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:605
IteratorT end() const
Definition iterators.hpp:612
bool empty() const
Definition iterators.hpp:615
IteratorDecayTy::value_type at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:620
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:601
IteratorDecayTy::value_type operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:628
std::ptrdiff_t size() const
Definition iterators.hpp:632
typename std::decay< assembly::Instruction::Iterator >::type IteratorDecayTy
Definition iterators.hpp:602
Definition iterators.hpp:1004
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:1013
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:1010
Iterator which returns reference on container's values.
Definition iterators.hpp:45
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:236
ref_iterator & operator--()
Definition iterators.hpp:149
size_t size() const
Definition iterators.hpp:267
ref_iterator & operator++()
Definition iterators.hpp:137
void swap(ref_iterator &other) noexcept
Definition iterators.hpp:127
bool operator<(const ref_iterator &rhs) const
Definition iterators.hpp:221
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:211
ref_iterator operator++(int)
Definition iterators.hpp:143
ref_iterator begin() const
Definition iterators.hpp:240
sections_t container_type
Definition iterators.hpp:56
typename ref_iterator::reference ref_t
Definition iterators.hpp:59
ref_iterator operator--(int)
Definition iterators.hpp:157
ref_iterator cend() const
Definition iterators.hpp:255
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:165
std::bidirectional_iterator_tag iterator_category
Definition iterators.hpp:50
ref_iterator(ref_iterator &&other) noexcept
Definition iterators.hpp:62
ptrdiff_t difference_type
Definition iterators.hpp:52
ref_iterator operator+(typename ref_iterator::difference_type n) const
Definition iterators.hpp:205
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type & reference
Definition iterators.hpp:54
ref_iterator cbegin() const
Definition iterators.hpp:244
bool empty() const
Definition iterators.hpp:271
ref_iterator & operator=(ref_iterator other)
Definition iterators.hpp:122
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type * pointer
Definition iterators.hpp:53
ref_iterator & operator=(ref_iterator &&other) noexcept
Definition iterators.hpp:69
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:263
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:180
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:226
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:231
ref_iterator(const ref_iterator ©)
Definition iterators.hpp:115
ref_iterator(ref_iterator< T2, U2, IT2 > &&other) noexcept
Definition iterators.hpp:100
ref_iterator end() const
Definition iterators.hpp:248
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:285
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:292
ref_iterator & operator-=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:173
ref_iterator(const ref_iterator< T2, U2, IT2 > &other)
Definition iterators.hpp:85
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:187
decay_t< typename decay_t< sections_t >::value_type > value_type
Definition iterators.hpp:51
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:277
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:217
typename decay_t< sections_t >::value_type DT_VAL
Definition iterators.hpp:57
typename ref_iterator::pointer pointer_t
Definition iterators.hpp:60
friend class ref_iterator
Definition iterators.hpp:47
ref_iterator(T container)
Definition iterators.hpp:111
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:298
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:304
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:259
decay_t< sections_t > DT
Definition iterators.hpp:58
@ T
Definition AcceleratorCodes.hpp:97
LIEF namespace.
Definition Abstract/Binary.hpp:40
typename std::add_lvalue_reference< T >::type add_lvalue_reference_t
Definition iterators.hpp:39
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:591
typename std::remove_const< T >::type remove_const_t
Definition iterators.hpp:36
typename std::decay< T >::type decay_t
Definition iterators.hpp:30
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:992
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:652
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:1021
typename std::add_const< T >::type add_const_t
Definition iterators.hpp:33
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:318
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:1031
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:978
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:984
pointee_iterator(U &&u)
Definition iterators.hpp:981