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_);
115 container_{std::forward<T>(container)},
116 it_(std::
begin(container_)) {}
119 container_{copy.container_},
120 it_{std::
begin(container_)},
121 distance_{copy.distance_} {
122 std::advance(it_, distance_);
135 std::swap(it_, other.it_);
136 std::swap(distance_, other.distance_);
141 it_ = std::next(it_);
153 if (it_ != std::begin(container_)) {
154 it_ = std::prev(it_);
170 std::advance(it_, movement);
171 distance_ += movement;
179 return (*
this) += -movement;
192 assert(n <
size() &&
"integrity error: out of bound");
197 std::distance(std::begin(no_const_this->container_), no_const_this->it_);
198 no_const_this->it_ = std::begin(no_const_this->container_);
199 std::advance(no_const_this->it_, n);
203 no_const_this->it_ = std::begin(no_const_this->container_);
204 std::advance(no_const_this->it_, saved_dist);
222 return distance_ - rhs.distance_;
226 return (rhs - *
this) > 0;
236 return !(*
this < rhs);
241 return !(*
this > rhs);
254 it.it_ = std::end(it.container_);
255 it.distance_ = it.
size();
264 return (
size() == other.
size() && distance_ == other.distance_);
268 return !(*
this == other);
272 return container_.size();
276 return container_.empty();
285 template<
typename V = DT_VAL>
287 assert(*it_ &&
"integrity error: nullptr");
291 template<
typename V = DT_VAL>
315template<class T, typename U = typename decay_t<T>::value_type,
316 class CT = std::add_const_t<T>>
322template<class T, typename U = typename decay_t<T>::value_type,
338 using filter_t = std::function<bool(
const typename DT::value_type&)>;
341 size_c_(other.size_c_),
342 size_cached_(other.size_cached_),
343 container_(std::forward<T>(other.container_)),
344 it_(std::begin(container_)),
345 filters_{std::move(other.filters_)},
346 distance_(other.distance_) {
347 std::advance(it_, distance_);
351 if (
this == &other) {
355 size_c_ = other.size_c_;
356 size_cached_ = other.size_cached_;
357 container_ = std::forward<T>(other.container_);
358 it_ = std::begin(container_);
359 filters_ = std::move(other.filters_);
360 distance_ = other.distance_;
362 std::advance(it_, distance_);
371 container_{std::forward<T>(container)},
372 it_(std::
begin(container_)),
376 filters_.push_back(std::move(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_); }))
389 container_{std::forward<T>(container)},
390 it_(std::
begin(container_)),
394 if (it_ != std::end(container_)) {
395 if (!std::all_of(std::begin(filters_), std::end(filters_),
396 [
this](
const filter_t& f) {
return f(*it_); }))
405 container_{std::forward<T>(container)},
406 it_(std::
begin(container_)),
410 container_{copy.container_},
411 it_{std::
begin(container_)},
412 filters_{copy.filters_},
413 distance_{copy.distance_} {
414 std::advance(it_, distance_);
425 std::swap(it_, other.it_);
426 std::swap(filters_, other.filters_);
427 std::swap(size_c_, other.size_c_);
428 std::swap(size_cached_, other.size_cached_);
429 std::swap(distance_, other.distance_);
434 filters_.push_back(func);
436 size_cached_ =
false;
452 return {container_, filters_};
463 it_end.it_ = it_end.container_.end();
464 it_end.distance_ = it_end.container_.size();
479 template<
typename V = DT_VAL>
481 assert(*it_ &&
"integrity error: nullptr");
485 template<
typename V = DT_VAL>
499 assert(n <
size() &&
"integrity error: out of bound");
518 if (filters_.empty()) {
519 return container_.size();
528 auto end_iter = it.
end();
529 for (; it != end_iter; ++it) {
539 if (filters_.empty()) {
540 return container_.empty();
552 return (container_.size() == other.container_.size() &&
553 distance_ == other.distance_);
557 return !(*
this == other);
562 if (it_ == std::end(container_)) {
563 distance_ = container_.size();
568 it_ = std::next(it_);
570 }
while (it_ != std::end(container_) &&
571 !std::all_of(std::begin(filters_), std::end(filters_),
572 [
this](
const filter_t& f) {
return f(*it_); }));
576 mutable size_t size_c_ = 0;
577 mutable bool size_cached_ =
false;
580 std::vector<filter_t> filters_;
585template<class T, typename U = typename decay_t<T>::value_type,
586 class CT = std::add_const_t<T>>
594template<
typename IteratorT>
602 begin_(std::forward<T>(it_begin)),
603 end_(std::forward<T>(it_end)) {}
612 return begin_ == end_;
615 class ReferenceProxy {
621 it_(std::move(it)) {}
624 using reference =
decltype(*std::declval<const IteratorDecayTy&>());
630 template<
class It = IteratorDecayTy>
631 auto operator->() const -> decltype(&*std::declval<const It&>()) {
636 ReferenceProxy
at(
typename IteratorDecayTy::difference_type pos)
const {
637 static_assert(IsRandomAccess,
"at() needs random access iterator");
639 std::advance(it, pos);
640 return ReferenceProxy(std::move(it));
643 ReferenceProxy
operator[](
typename IteratorDecayTy::difference_type pos)
const {
648 return std::distance(begin_, end_);
652 static constexpr bool IsRandomAccess =
653 std::is_base_of_v<std::random_access_iterator_tag,
654 typename IteratorDecayTy::iterator_category>;
655 static constexpr bool IsBidirectional =
656 std::is_base_of_v<std::bidirectional_iterator_tag,
657 typename IteratorDecayTy::iterator_category>;
671#if LIEF_HAS_STD_RANGES
672template<
typename IteratorT>
674 std::ranges::enable_borrowed_range<LIEF::iterator_range<IteratorT>> =
true;
737template<
typename DerivedT,
typename IteratorCategoryT,
typename T,
738 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT =
T*,
739 typename ReferenceT =
T&>
740class iterator_facade_base {
742 iterator_facade_base() =
default;
752 static constexpr bool IsRandomAccess =
753 std::is_base_of_v<std::random_access_iterator_tag, IteratorCategoryT>;
754 static constexpr bool IsBidirectional =
755 std::is_base_of_v<std::bidirectional_iterator_tag, IteratorCategoryT>;
762 class ReferenceProxy {
763 friend iterator_facade_base;
771 operator ReferenceT()
const {
785 template<
typename RefT>
786 PointerProxy(RefT&& R) :
787 R(std::forward<RefT>(R)) {}
797 static_assert(std::is_base_of_v<iterator_facade_base, DerivedT>,
798 "Must pass the derived type to this template!");
799 static_assert(IsRandomAccess,
800 "The '+' operator is only defined for random access iterators.");
806 static_assert(IsRandomAccess,
807 "The '+' operator is only defined for random access iterators.");
811 static_assert(IsRandomAccess,
812 "The '-' operator is only defined for random access iterators.");
819 static_assert(std::is_base_of_v<iterator_facade_base, DerivedT>,
820 "Must pass the derived type to this template!");
821 return static_cast<DerivedT*
>(
this)->
operator+=(1);
831 "The decrement operator is only defined for bidirectional iterators."
833 return static_cast<DerivedT*
>(
this)->
operator-=(1);
838 "The decrement operator is only defined for bidirectional iterators."
845#ifndef __cpp_impl_three_way_comparison
847 return !(
static_cast<const DerivedT&
>(*this) == RHS);
854 "Relational operators are only defined for random access iterators."
856 return !(
static_cast<const DerivedT&
>(*this) < RHS) &&
857 !(
static_cast<const DerivedT&
>(*
this) == RHS);
862 "Relational operators are only defined for random access iterators."
864 return !(
static_cast<const DerivedT&
>(*this) > RHS);
869 "Relational operators are only defined for random access iterators."
871 return !(
static_cast<const DerivedT&
>(*this) < RHS);
875 return static_cast<const DerivedT*
>(
this)->
operator*();
878 static_assert(IsRandomAccess,
879 "Subscripting is only defined for random access iterators.");
880 return static_cast<const DerivedT*
>(
this)->
operator+(n);
889template<
typename DerivedT,
typename WrappedIteratorT,
890 typename IteratorCategoryT =
891 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
892 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
893 typename DifferenceTypeT =
894 typename std::iterator_traits<WrappedIteratorT>::difference_type,
895 typename PointerT = std::conditional_t<
896 std::is_same_v<T, typename std::iterator_traits<WrappedIteratorT>::
898 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
900 typename ReferenceT = std::conditional_t<
901 std::is_same_v<T, typename std::iterator_traits<WrappedIteratorT>::
903 typename std::iterator_traits<WrappedIteratorT>::reference, T&
905class iterator_adaptor_base
906 :
public iterator_facade_base<DerivedT, IteratorCategoryT, T, DifferenceTypeT,
907 PointerT, ReferenceT> {
908 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
913 iterator_adaptor_base() =
default;
915 explicit iterator_adaptor_base(WrappedIteratorT u) :
917 static_assert(std::is_base_of_v<iterator_adaptor_base, DerivedT>,
918 "Must pass the derived type to this template!");
921 const WrappedIteratorT& wrapped()
const {
930 BaseT::IsRandomAccess,
931 "The '+=' operator is only defined for random access iterators."
934 return *
static_cast<DerivedT*
>(
this);
938 BaseT::IsRandomAccess,
939 "The '-=' operator is only defined for random access iterators."
942 return *
static_cast<DerivedT*
>(
this);
944 using BaseT::operator-;
946 static_assert(BaseT::IsRandomAccess,
947 "The '-' operator is only defined for random access iterators.");
953 using BaseT::operator++;
956 return *
static_cast<DerivedT*
>(
this);
958 using BaseT::operator--;
961 BaseT::IsBidirectional,
962 "The decrement operator is only defined for bidirectional iterators."
965 return *
static_cast<DerivedT*
>(
this);
969 const iterator_adaptor_base& RHS) {
970 return LHS.I == RHS.I;
973 const iterator_adaptor_base& RHS) {
975 BaseT::IsRandomAccess,
976 "Relational operators are only defined for random access iterators."
978 return LHS.I < RHS.I;
995template<
typename WrappedIteratorT,
997 std::remove_reference_t<decltype(**std::declval<WrappedIteratorT>())>>
999 : iterator_adaptor_base<
1004 template<
typename U>
1013template<
typename RangeT,
1014 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1015iterator_range<pointee_iterator<WrappedIteratorT>>
1018 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
1019 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
1022template<
typename WrappedIteratorT,
1023 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
1025 : public iterator_adaptor_base<
1038 return Ptr = &*this->I;
1042template<
typename RangeT,
1043 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1044iterator_range<pointer_iterator<WrappedIteratorT>>
1047 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
1048 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
1051template<
typename WrappedIteratorT,
1053 std::remove_reference_t<decltype(**std::declval<WrappedIteratorT>())>,
1054 typename T2 = std::add_pointer_t<T1>>
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:324
std::enable_if_t<!std::is_const_v< pointer_t >, pointer_t > operator->()
Definition iterators.hpp:507
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:551
filter_iterator(const filter_iterator ©)
Definition iterators.hpp:409
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:498
filter_iterator cend() const
Definition iterators.hpp:469
std::enable_if_t< std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:480
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:370
std::forward_iterator_tag iterator_category
Definition iterators.hpp:327
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator*()
Definition iterators.hpp:473
filter_iterator(T container)
Definition iterators.hpp:404
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:422
filter_iterator & operator++()
Definition iterators.hpp:440
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:388
filter_iterator end() const
Definition iterators.hpp:459
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:337
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:417
decay_t< Symbol * > value_type
Definition iterators.hpp:328
std::remove_pointer_t< Symbol * > * pointer
Definition iterators.hpp:330
typename filter_iterator::reference ref_t
Definition iterators.hpp:336
filter_iterator begin() const
Definition iterators.hpp:451
bool empty() const
Definition iterators.hpp:538
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator[](size_t n)
Definition iterators.hpp:492
Symbol * DT_VAL
Definition iterators.hpp:334
ptrdiff_t difference_type
Definition iterators.hpp:329
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:513
size_t size() const
Definition iterators.hpp:517
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:556
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:338
std::enable_if_t<!std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:486
std::remove_pointer_t< Symbol * > & reference
Definition iterators.hpp:331
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:340
symbols_t & container_type
Definition iterators.hpp:333
filter_iterator operator++(int)
Definition iterators.hpp:445
decay_t< symbols_t & > DT
Definition iterators.hpp:335
filter_iterator cbegin() const
Definition iterators.hpp:455
filter_iterator & def(filter_t func)
Definition iterators.hpp:433
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:350
DerivedT & operator++()
Definition iterators.hpp:954
DerivedT & operator--()
Definition iterators.hpp:959
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:936
ReferenceT operator*() const
Definition iterators.hpp:981
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:972
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:968
DifferenceTypeT difference_type
Definition iterators.hpp:926
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:928
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:945
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:740
DifferenceTypeT difference_type
Definition iterators.hpp:747
PointerProxy operator->() const
Definition iterators.hpp:874
DerivedT & operator--()
Definition iterators.hpp:828
DerivedT operator++(int)
Definition iterators.hpp:823
T value_type
Definition iterators.hpp:746
friend DerivedT
Definition iterators.hpp:741
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:805
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:851
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:877
ReferenceT reference
Definition iterators.hpp:749
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:866
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:810
DerivedT & operator++()
Definition iterators.hpp:818
PointerT pointer
Definition iterators.hpp:748
DerivedT operator--(int)
Definition iterators.hpp:835
IteratorCategoryT iterator_category
Definition iterators.hpp:745
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:796
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:846
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:859
decltype(*std::declval< const IteratorDecayTy & >()) reference
Definition iterators.hpp:624
auto operator->() const -> decltype(&*std::declval< const It & >())
Definition iterators.hpp:631
friend iterator_range
Definition iterators.hpp:616
Definition iterators.hpp:595
IteratorT begin() const
Definition iterators.hpp:605
ReferenceProxy at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:636
std::decay_t< assembly::Instruction::Iterator > IteratorDecayTy
Definition iterators.hpp:598
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:601
IteratorT end() const
Definition iterators.hpp:608
bool empty() const
Definition iterators.hpp:611
ReferenceProxy operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:643
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:597
std::ptrdiff_t size() const
Definition iterators.hpp:647
Definition iterators.hpp:1028
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:1037
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:1034
Iterator which returns reference on container's values.
Definition iterators.hpp:47
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:240
ref_iterator & operator--()
Definition iterators.hpp:152
size_t size() const
Definition iterators.hpp:271
ref_iterator & operator++()
Definition iterators.hpp:140
void swap(ref_iterator &other) noexcept
Definition iterators.hpp:130
bool operator<(const ref_iterator &rhs) const
Definition iterators.hpp:225
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:215
ref_iterator operator++(int)
Definition iterators.hpp:146
ref_iterator begin() const
Definition iterators.hpp:244
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:160
ref_iterator cend() const
Definition iterators.hpp:259
std::enable_if_t<!std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:292
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:167
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator[](size_t n)
Definition iterators.hpp:184
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:279
std::enable_if_t< std::is_pointer_v< V >, add_const_t< ref_t > > operator*() const
Definition iterators.hpp:286
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:209
ref_iterator cbegin() const
Definition iterators.hpp:248
bool empty() const
Definition iterators.hpp:275
ref_iterator & operator=(ref_iterator other)
Definition iterators.hpp:125
ref_iterator & operator=(ref_iterator &&other) noexcept
Definition iterators.hpp:71
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:267
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:230
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:235
ref_iterator(const ref_iterator ©)
Definition iterators.hpp:118
ref_iterator(ref_iterator< T2, U2, IT2 > &&other) noexcept
Definition iterators.hpp:102
ref_iterator end() const
Definition iterators.hpp:252
ref_iterator & operator-=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:176
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:191
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:297
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:221
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:114
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:303
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:263
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:587
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:1016
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:665
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:1045
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:317
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:1055
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:1002
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:1008
pointee_iterator(U &&u)
Definition iterators.hpp:1005