17#ifndef LIEF_ITERATORS_H
18#define LIEF_ITERATORS_H
32using decay_t =
typename std::decay<T>::type;
45template<class T, typename U = typename decay_t<T>::value_type,
48 template<
class,
typename,
class>
55 using pointer =
typename std::remove_pointer<U>::type*;
56 using reference =
typename std::remove_pointer<U>::type&;
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 =
typename std::enable_if<
84 !std::is_same<ref_iterator, ref_iterator<T2, U2, IT2>>::value &&
91 it_{std::
begin(container_)},
92 distance_{other.distance_} {
93 std::advance(it_, distance_);
96 template<
class T2,
typename U2,
class IT2,
97 typename =
typename std::enable_if<
98 !std::is_same<ref_iterator, ref_iterator<T2, U2, IT2>>::value &&
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_);
168 std::advance(it_, movement);
169 distance_ += movement;
176 return (*
this) += -movement;
180 typename std::enable_if<!std::is_const<ref_t>::value,
190 assert(n <
size() &&
"integrity error: out of bound");
195 std::distance(std::begin(no_const_this->container_), no_const_this->it_);
196 no_const_this->it_ = std::begin(no_const_this->container_);
197 std::advance(no_const_this->it_, n);
201 no_const_this->it_ = std::begin(no_const_this->container_);
202 std::advance(no_const_this->it_, saved_dist);
220 return distance_ - rhs.distance_;
224 return (rhs - *
this) > 0;
234 return !(*
this < rhs);
239 return !(*
this > rhs);
252 it.it_ = std::end(it.container_);
253 it.distance_ = it.
size();
262 return (
size() == other.
size() && distance_ == other.distance_);
266 return !(*
this == other);
270 return container_.size();
274 return container_.empty();
277 typename std::enable_if<!std::is_const<ref_t>::value,
285 template<
typename V = DT_VAL>
288 assert(*it_ &&
"integrity error: nullptr");
292 template<
typename V = DT_VAL>
299 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
318template<class T, typename U = typename decay_t<T>::value_type,
319 class CT =
typename std::add_const<T>::type>
325template<class T, typename U = typename decay_t<T>::value_type,
333 using pointer =
typename std::remove_pointer<U>::type*;
334 using reference =
typename std::remove_pointer<U>::type&;
341 using filter_t = std::function<bool(
const typename DT::value_type&)>;
344 size_c_(other.size_c_),
345 size_cached_(other.size_cached_),
346 container_(std::forward<T>(other.container_)),
347 it_(std::begin(container_)),
348 filters_{std::move(other.filters_)},
349 distance_(other.distance_) {
350 std::advance(it_, distance_);
354 if (
this == &other) {
358 size_c_ = other.size_c_;
359 size_cached_ = other.size_cached_;
360 container_ = std::forward<T>(other.container_);
361 it_ = std::begin(container_);
362 filters_ = std::move(other.filters_);
363 distance_ = other.distance_;
365 std::advance(it_, distance_);
373 container_{std::forward<T>(container)},
374 it_(std::
begin(container_)),
378 filters_.push_back(filter);
380 if (it_ != std::end(container_)) {
381 if (!std::all_of(std::begin(filters_), std::end(filters_),
382 [
this](
const filter_t& f) {
return f(*it_); }))
390 container_{std::forward<T>(container)},
391 it_(std::
begin(container_)),
395 if (it_ != std::end(container_)) {
396 if (!std::all_of(std::begin(filters_), std::end(filters_),
397 [
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();
473 typename std::enable_if<!std::is_const<ref_t>::value,
481 template<
typename V = DT_VAL>
484 assert(*it_ &&
"integrity error: nullptr");
488 template<
typename V = DT_VAL>
495 typename std::enable_if<!std::is_const<ref_t>::value,
504 assert(n <
size() &&
"integrity error: out of bound");
512 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
524 if (filters_.empty()) {
525 return container_.size();
534 auto end_iter = it.
end();
535 for (; it != end_iter; ++it) {
545 if (filters_.empty()) {
546 return container_.empty();
558 return (container_.size() == other.container_.size() &&
559 distance_ == other.distance_);
563 return !(*
this == other);
568 if (it_ == std::end(container_)) {
569 distance_ = container_.size();
574 it_ = std::next(it_);
576 }
while (it_ != std::end(container_) &&
577 !std::all_of(std::begin(filters_), std::end(filters_),
578 [
this](
const filter_t& f) {
return f(*it_); }));
582 mutable size_t size_c_ = 0;
583 mutable bool size_cached_ =
false;
586 std::vector<filter_t> filters_;
591template<class T, typename U = typename decay_t<T>::value_type,
592 class CT =
typename std::add_const<T>::type>
600template<
typename IteratorT>
608 begin_(std::forward<T>(it_begin)),
609 end_(std::forward<T>(it_end)) {}
618 return begin_ == end_;
621 typename IteratorDecayTy::value_type
622 at(
typename IteratorDecayTy::difference_type pos)
const {
623 static_assert(IsRandomAccess,
"at() needs random access iterator");
625 std::advance(it, pos);
629 typename IteratorDecayTy::value_type
630 operator[](
typename IteratorDecayTy::difference_type pos)
const {
635 return std::distance(begin_, end_);
641 std::is_base_of<std::random_access_iterator_tag,
642 typename IteratorDecayTy::iterator_category>::value,
644 std::is_base_of<std::bidirectional_iterator_tag,
645 typename IteratorDecayTy::iterator_category>::value,
660#if LIEF_HAS_STD_RANGES
661template<
typename IteratorT>
663 std::ranges::enable_borrowed_range<LIEF::iterator_range<IteratorT>> =
true;
726template<
typename DerivedT,
typename IteratorCategoryT,
typename T,
727 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT =
T*,
728 typename ReferenceT =
T&>
740 std::is_base_of<std::random_access_iterator_tag, IteratorCategoryT>::value,
742 std::is_base_of<std::bidirectional_iterator_tag, IteratorCategoryT>::value,
750 class ReferenceProxy {
755 ReferenceProxy(DerivedT I) :
759 operator ReferenceT()
const {
769 friend iterator_facade_base;
773 template<
typename RefT>
774 PointerProxy(RefT&& R) :
775 R(std::forward<RefT>(R)) {}
785 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
786 "Must pass the derived type to this template!");
787 static_assert(IsRandomAccess,
788 "The '+' operator is only defined for random access iterators.");
789 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
793 friend DerivedT
operator+(DifferenceTypeT n,
const DerivedT& i) {
794 static_assert(IsRandomAccess,
795 "The '+' operator is only defined for random access iterators.");
799 static_assert(IsRandomAccess,
800 "The '-' operator is only defined for random access iterators.");
801 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
807 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
808 "Must pass the derived type to this template!");
809 return static_cast<DerivedT*
>(
this)->
operator+=(1);
812 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
813 ++*
static_cast<DerivedT*
>(
this);
819 "The decrement operator is only defined for bidirectional iterators."
821 return static_cast<DerivedT*
>(
this)->
operator-=(1);
826 "The decrement operator is only defined for bidirectional iterators."
828 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
829 --*
static_cast<DerivedT*
>(
this);
833#ifndef __cpp_impl_three_way_comparison
835 return !(
static_cast<const DerivedT&
>(*this) == RHS);
842 "Relational operators are only defined for random access iterators."
844 return !(
static_cast<const DerivedT&
>(*this) < RHS) &&
845 !(
static_cast<const DerivedT&
>(*
this) == RHS);
850 "Relational operators are only defined for random access iterators."
852 return !(
static_cast<const DerivedT&
>(*this) > RHS);
857 "Relational operators are only defined for random access iterators."
859 return !(
static_cast<const DerivedT&
>(*this) < RHS);
863 return static_cast<const DerivedT*
>(
this)->
operator*();
866 static_assert(IsRandomAccess,
867 "Subscripting is only defined for random access iterators.");
868 return static_cast<const DerivedT*
>(
this)->
operator+(n);
877template<
typename DerivedT,
typename WrappedIteratorT,
878 typename IteratorCategoryT =
879 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
880 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
881 typename DifferenceTypeT =
882 typename std::iterator_traits<WrappedIteratorT>::difference_type,
883 typename PointerT =
typename std::conditional<
884 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
886 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
888 typename ReferenceT =
typename std::conditional<
889 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
891 typename std::iterator_traits<WrappedIteratorT>::reference, T&
893class iterator_adaptor_base
895 PointerT, ReferenceT> {
896 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
901 iterator_adaptor_base() =
default;
903 explicit iterator_adaptor_base(WrappedIteratorT u) :
905 static_assert(std::is_base_of<iterator_adaptor_base, DerivedT>::value,
906 "Must pass the derived type to this template!");
909 const WrappedIteratorT& wrapped()
const {
918 BaseT::IsRandomAccess,
919 "The '+=' operator is only defined for random access iterators."
922 return *
static_cast<DerivedT*
>(
this);
926 BaseT::IsRandomAccess,
927 "The '-=' operator is only defined for random access iterators."
930 return *
static_cast<DerivedT*
>(
this);
932 using BaseT::operator-;
934 static_assert(BaseT::IsRandomAccess,
935 "The '-' operator is only defined for random access iterators.");
941 using BaseT::operator++;
944 return *
static_cast<DerivedT*
>(
this);
946 using BaseT::operator--;
949 BaseT::IsBidirectional,
950 "The decrement operator is only defined for bidirectional iterators."
953 return *
static_cast<DerivedT*
>(
this);
957 const iterator_adaptor_base& RHS) {
958 return LHS.I == RHS.I;
961 const iterator_adaptor_base& RHS) {
963 BaseT::IsRandomAccess,
964 "Relational operators are only defined for random access iterators."
966 return LHS.I < RHS.I;
983template<
typename WrappedIteratorT,
984 typename T =
typename std::
985 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type>
987 : iterator_adaptor_base<
1001template<
typename RangeT,
1002 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1003iterator_range<pointee_iterator<WrappedIteratorT>>
1006 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
1007 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
1010template<
typename WrappedIteratorT,
1011 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
1013 : public iterator_adaptor_base<
1026 return Ptr = &*this->I;
1030template<
typename RangeT,
1031 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1032iterator_range<pointer_iterator<WrappedIteratorT>>
1035 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
1036 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
1039template<
typename WrappedIteratorT,
1040 typename T1 =
typename std::
1041 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type,
1042 typename T2 =
typename std::add_pointer<T1>::type>
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:327
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:490
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:557
filter_iterator(const filter_iterator ©)
Definition iterators.hpp:409
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:503
filter_iterator cend() const
Definition iterators.hpp:469
typename std::remove_pointer< Symbol * >::type * pointer
Definition iterators.hpp:333
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:372
std::forward_iterator_tag iterator_category
Definition iterators.hpp:330
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
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:513
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:389
filter_iterator end() const
Definition iterators.hpp:459
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:340
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:417
decay_t< Symbol * > value_type
Definition iterators.hpp:331
typename filter_iterator::reference ref_t
Definition iterators.hpp:339
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:475
filter_iterator begin() const
Definition iterators.hpp:451
bool empty() const
Definition iterators.hpp:544
Symbol * DT_VAL
Definition iterators.hpp:337
ptrdiff_t difference_type
Definition iterators.hpp:332
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:519
size_t size() const
Definition iterators.hpp:523
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:483
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:562
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:341
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:343
symbols_t & container_type
Definition iterators.hpp:336
filter_iterator operator++(int)
Definition iterators.hpp:445
decay_t< symbols_t & > DT
Definition iterators.hpp:338
filter_iterator cbegin() const
Definition iterators.hpp:455
filter_iterator & def(filter_t func)
Definition iterators.hpp:433
typename std::remove_pointer< Symbol * >::type & reference
Definition iterators.hpp:334
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:353
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:497
DerivedT & operator++()
Definition iterators.hpp:942
DerivedT & operator--()
Definition iterators.hpp:947
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:924
ReferenceT operator*() const
Definition iterators.hpp:969
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:960
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:956
DifferenceTypeT difference_type
Definition iterators.hpp:914
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:916
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:933
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:729
DifferenceTypeT difference_type
Definition iterators.hpp:733
PointerProxy operator->() const
Definition iterators.hpp:862
DerivedT & operator--()
Definition iterators.hpp:816
DerivedT operator++(int)
Definition iterators.hpp:811
T value_type
Definition iterators.hpp:732
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:793
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:839
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:865
ReferenceT reference
Definition iterators.hpp:735
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:854
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:798
DerivedT & operator++()
Definition iterators.hpp:806
PointerT pointer
Definition iterators.hpp:734
DerivedT operator--(int)
Definition iterators.hpp:823
IteratorCategoryT iterator_category
Definition iterators.hpp:731
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:784
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:834
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:847
Definition iterators.hpp:601
IteratorT begin() const
Definition iterators.hpp:611
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:607
IteratorT end() const
Definition iterators.hpp:614
bool empty() const
Definition iterators.hpp:617
IteratorDecayTy::value_type at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:622
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:603
IteratorDecayTy::value_type operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:630
std::ptrdiff_t size() const
Definition iterators.hpp:634
typename std::decay< assembly::Instruction::Iterator >::type IteratorDecayTy
Definition iterators.hpp:604
Definition iterators.hpp:1016
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:1025
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:1022
Iterator which returns reference on container's values.
Definition iterators.hpp:47
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:238
ref_iterator & operator--()
Definition iterators.hpp:151
size_t size() const
Definition iterators.hpp:269
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:223
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:213
ref_iterator operator++(int)
Definition iterators.hpp:145
ref_iterator begin() const
Definition iterators.hpp:242
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:257
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:167
std::bidirectional_iterator_tag iterator_category
Definition iterators.hpp:52
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:207
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type & reference
Definition iterators.hpp:56
ref_iterator cbegin() const
Definition iterators.hpp:246
bool empty() const
Definition iterators.hpp:273
ref_iterator & operator=(ref_iterator other)
Definition iterators.hpp:124
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type * pointer
Definition iterators.hpp:55
ref_iterator & operator=(ref_iterator &&other) noexcept
Definition iterators.hpp:71
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:265
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:182
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:228
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:233
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:250
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:287
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:294
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:189
decay_t< typename decay_t< sections_t >::value_type > value_type
Definition iterators.hpp:53
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:279
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:219
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
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:300
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:306
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:261
decay_t< sections_t > DT
Definition iterators.hpp:60
@ 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: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:593
typename std::remove_const< T >::type remove_const_t
Definition iterators.hpp:38
typename std::decay< T >::type decay_t
Definition iterators.hpp:32
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:1004
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:654
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:1033
typename std::add_const< T >::type add_const_t
Definition iterators.hpp:35
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:320
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:1043
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:990
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:996
pointee_iterator(U &&u)
Definition iterators.hpp:993