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_);
169 std::advance(it_, movement);
170 distance_ += movement;
178 return (*
this) += -movement;
182 typename std::enable_if<!std::is_const<ref_t>::value,
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();
279 typename std::enable_if<!std::is_const<ref_t>::value,
287 template<
typename V = DT_VAL>
290 assert(*it_ &&
"integrity error: nullptr");
294 template<
typename V = DT_VAL>
301 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
320template<class T, typename U = typename decay_t<T>::value_type,
321 class CT =
typename std::add_const<T>::type>
327template<class T, typename U = typename decay_t<T>::value_type,
335 using pointer =
typename std::remove_pointer<U>::type*;
336 using reference =
typename std::remove_pointer<U>::type&;
343 using filter_t = std::function<bool(
const typename DT::value_type&)>;
346 size_c_(other.size_c_),
347 size_cached_(other.size_cached_),
348 container_(std::forward<T>(other.container_)),
349 it_(std::begin(container_)),
350 filters_{std::move(other.filters_)},
351 distance_(other.distance_) {
352 std::advance(it_, distance_);
356 if (
this == &other) {
360 size_c_ = other.size_c_;
361 size_cached_ = other.size_cached_;
362 container_ = std::forward<T>(other.container_);
363 it_ = std::begin(container_);
364 filters_ = std::move(other.filters_);
365 distance_ = other.distance_;
367 std::advance(it_, distance_);
375 container_{std::forward<T>(container)},
376 it_(std::
begin(container_)),
380 filters_.push_back(filter);
382 if (it_ != std::end(container_)) {
383 if (!std::all_of(std::begin(filters_), std::end(filters_),
384 [
this](
const filter_t& f) {
return f(*it_); }))
392 container_{std::forward<T>(container)},
393 it_(std::
begin(container_)),
397 if (it_ != std::end(container_)) {
398 if (!std::all_of(std::begin(filters_), std::end(filters_),
399 [
this](
const filter_t& f) {
return f(*it_); }))
407 container_{std::forward<T>(container)},
408 it_(std::
begin(container_)),
412 container_{copy.container_},
413 it_{std::
begin(container_)},
414 filters_{copy.filters_},
415 distance_{copy.distance_} {
416 std::advance(it_, distance_);
427 std::swap(it_, other.it_);
428 std::swap(filters_, other.filters_);
429 std::swap(size_c_, other.size_c_);
430 std::swap(size_cached_, other.size_cached_);
431 std::swap(distance_, other.distance_);
436 filters_.push_back(func);
438 size_cached_ =
false;
454 return {container_, filters_};
465 it_end.it_ = it_end.container_.end();
466 it_end.distance_ = it_end.container_.size();
475 typename std::enable_if<!std::is_const<ref_t>::value,
483 template<
typename V = DT_VAL>
486 assert(*it_ &&
"integrity error: nullptr");
490 template<
typename V = DT_VAL>
497 typename std::enable_if<!std::is_const<ref_t>::value,
506 assert(n <
size() &&
"integrity error: out of bound");
514 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
526 if (filters_.empty()) {
527 return container_.size();
536 auto end_iter = it.
end();
537 for (; it != end_iter; ++it) {
547 if (filters_.empty()) {
548 return container_.empty();
560 return (container_.size() == other.container_.size() &&
561 distance_ == other.distance_);
565 return !(*
this == other);
570 if (it_ == std::end(container_)) {
571 distance_ = container_.size();
576 it_ = std::next(it_);
578 }
while (it_ != std::end(container_) &&
579 !std::all_of(std::begin(filters_), std::end(filters_),
580 [
this](
const filter_t& f) {
return f(*it_); }));
584 mutable size_t size_c_ = 0;
585 mutable bool size_cached_ =
false;
588 std::vector<filter_t> filters_;
593template<class T, typename U = typename decay_t<T>::value_type,
594 class CT =
typename std::add_const<T>::type>
602template<
typename IteratorT>
610 begin_(std::forward<T>(it_begin)),
611 end_(std::forward<T>(it_end)) {}
620 return begin_ == end_;
623 class ReferenceProxy {
624 friend iterator_range;
629 it_(std::move(it)) {}
632 using reference =
decltype(*std::declval<const IteratorDecayTy&>());
638 template<
class It = IteratorDecayTy>
639 auto operator->() const -> decltype(&*std::declval<const It&>()) {
644 ReferenceProxy
at(
typename IteratorDecayTy::difference_type pos)
const {
645 static_assert(IsRandomAccess,
"at() needs random access iterator");
647 std::advance(it, pos);
648 return ReferenceProxy(std::move(it));
651 ReferenceProxy
operator[](
typename IteratorDecayTy::difference_type pos)
const {
656 return std::distance(begin_, end_);
662 std::is_base_of<std::random_access_iterator_tag,
663 typename IteratorDecayTy::iterator_category>::value,
665 std::is_base_of<std::bidirectional_iterator_tag,
666 typename IteratorDecayTy::iterator_category>::value,
681#if LIEF_HAS_STD_RANGES
682template<
typename IteratorT>
684 std::ranges::enable_borrowed_range<LIEF::iterator_range<IteratorT>> =
true;
747template<
typename DerivedT,
typename IteratorCategoryT,
typename T,
748 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT =
T*,
749 typename ReferenceT =
T&>
761 std::is_base_of<std::random_access_iterator_tag, IteratorCategoryT>::value,
763 std::is_base_of<std::bidirectional_iterator_tag, IteratorCategoryT>::value,
771 class ReferenceProxy {
776 ReferenceProxy(DerivedT I) :
780 operator ReferenceT()
const {
790 friend iterator_facade_base;
794 template<
typename RefT>
795 PointerProxy(RefT&& R) :
796 R(std::forward<RefT>(R)) {}
806 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
807 "Must pass the derived type to this template!");
808 static_assert(IsRandomAccess,
809 "The '+' operator is only defined for random access iterators.");
810 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
814 friend DerivedT
operator+(DifferenceTypeT n,
const DerivedT& i) {
815 static_assert(IsRandomAccess,
816 "The '+' operator is only defined for random access iterators.");
820 static_assert(IsRandomAccess,
821 "The '-' operator is only defined for random access iterators.");
822 DerivedT tmp = *
static_cast<const DerivedT*
>(
this);
828 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
829 "Must pass the derived type to this template!");
830 return static_cast<DerivedT*
>(
this)->
operator+=(1);
833 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
834 ++*
static_cast<DerivedT*
>(
this);
840 "The decrement operator is only defined for bidirectional iterators."
842 return static_cast<DerivedT*
>(
this)->
operator-=(1);
847 "The decrement operator is only defined for bidirectional iterators."
849 DerivedT tmp = *
static_cast<DerivedT*
>(
this);
850 --*
static_cast<DerivedT*
>(
this);
854#ifndef __cpp_impl_three_way_comparison
856 return !(
static_cast<const DerivedT&
>(*this) == RHS);
863 "Relational operators are only defined for random access iterators."
865 return !(
static_cast<const DerivedT&
>(*this) < RHS) &&
866 !(
static_cast<const DerivedT&
>(*
this) == RHS);
871 "Relational operators are only defined for random access iterators."
873 return !(
static_cast<const DerivedT&
>(*this) > RHS);
878 "Relational operators are only defined for random access iterators."
880 return !(
static_cast<const DerivedT&
>(*this) < RHS);
884 return static_cast<const DerivedT*
>(
this)->
operator*();
887 static_assert(IsRandomAccess,
888 "Subscripting is only defined for random access iterators.");
889 return static_cast<const DerivedT*
>(
this)->
operator+(n);
898template<
typename DerivedT,
typename WrappedIteratorT,
899 typename IteratorCategoryT =
900 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
901 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
902 typename DifferenceTypeT =
903 typename std::iterator_traits<WrappedIteratorT>::difference_type,
904 typename PointerT =
typename std::conditional<
905 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
907 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
909 typename ReferenceT =
typename std::conditional<
910 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
912 typename std::iterator_traits<WrappedIteratorT>::reference, T&
914class iterator_adaptor_base
916 PointerT, ReferenceT> {
917 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
922 iterator_adaptor_base() =
default;
924 explicit iterator_adaptor_base(WrappedIteratorT u) :
926 static_assert(std::is_base_of<iterator_adaptor_base, DerivedT>::value,
927 "Must pass the derived type to this template!");
930 const WrappedIteratorT& wrapped()
const {
939 BaseT::IsRandomAccess,
940 "The '+=' operator is only defined for random access iterators."
943 return *
static_cast<DerivedT*
>(
this);
947 BaseT::IsRandomAccess,
948 "The '-=' operator is only defined for random access iterators."
951 return *
static_cast<DerivedT*
>(
this);
953 using BaseT::operator-;
955 static_assert(BaseT::IsRandomAccess,
956 "The '-' operator is only defined for random access iterators.");
962 using BaseT::operator++;
965 return *
static_cast<DerivedT*
>(
this);
967 using BaseT::operator--;
970 BaseT::IsBidirectional,
971 "The decrement operator is only defined for bidirectional iterators."
974 return *
static_cast<DerivedT*
>(
this);
978 const iterator_adaptor_base& RHS) {
979 return LHS.I == RHS.I;
982 const iterator_adaptor_base& RHS) {
984 BaseT::IsRandomAccess,
985 "Relational operators are only defined for random access iterators."
987 return LHS.I < RHS.I;
1004template<
typename WrappedIteratorT,
1005 typename T =
typename std::
1006 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type>
1008 : iterator_adaptor_base<
1013 template<
typename U>
1022template<
typename RangeT,
1023 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1024iterator_range<pointee_iterator<WrappedIteratorT>>
1027 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
1028 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
1031template<
typename WrappedIteratorT,
1032 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
1034 : public iterator_adaptor_base<
1047 return Ptr = &*this->I;
1051template<
typename RangeT,
1052 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1053iterator_range<pointer_iterator<WrappedIteratorT>>
1056 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
1057 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
1060template<
typename WrappedIteratorT,
1061 typename T1 =
typename std::
1062 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type,
1063 typename T2 =
typename std::add_pointer<T1>::type>
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:329
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:492
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:559
filter_iterator(const filter_iterator ©)
Definition iterators.hpp:411
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:505
filter_iterator cend() const
Definition iterators.hpp:471
typename std::remove_pointer< Symbol * >::type * pointer
Definition iterators.hpp:335
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:374
std::forward_iterator_tag iterator_category
Definition iterators.hpp:332
filter_iterator(T container)
Definition iterators.hpp:406
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:424
filter_iterator & operator++()
Definition iterators.hpp:442
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:515
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:391
filter_iterator end() const
Definition iterators.hpp:461
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:342
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:419
decay_t< Symbol * > value_type
Definition iterators.hpp:333
typename filter_iterator::reference ref_t
Definition iterators.hpp:341
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:477
filter_iterator begin() const
Definition iterators.hpp:453
bool empty() const
Definition iterators.hpp:546
Symbol * DT_VAL
Definition iterators.hpp:339
ptrdiff_t difference_type
Definition iterators.hpp:334
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:521
size_t size() const
Definition iterators.hpp:525
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:485
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:564
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:343
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:345
symbols_t & container_type
Definition iterators.hpp:338
filter_iterator operator++(int)
Definition iterators.hpp:447
decay_t< symbols_t & > DT
Definition iterators.hpp:340
filter_iterator cbegin() const
Definition iterators.hpp:457
filter_iterator & def(filter_t func)
Definition iterators.hpp:435
typename std::remove_pointer< Symbol * >::type & reference
Definition iterators.hpp:336
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:355
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:499
DerivedT & operator++()
Definition iterators.hpp:963
DerivedT & operator--()
Definition iterators.hpp:968
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:945
ReferenceT operator*() const
Definition iterators.hpp:990
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:981
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:977
DifferenceTypeT difference_type
Definition iterators.hpp:935
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:937
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:954
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:750
DifferenceTypeT difference_type
Definition iterators.hpp:754
PointerProxy operator->() const
Definition iterators.hpp:883
DerivedT & operator--()
Definition iterators.hpp:837
DerivedT operator++(int)
Definition iterators.hpp:832
T value_type
Definition iterators.hpp:753
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:814
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:860
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:886
ReferenceT reference
Definition iterators.hpp:756
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:875
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:819
DerivedT & operator++()
Definition iterators.hpp:827
PointerT pointer
Definition iterators.hpp:755
DerivedT operator--(int)
Definition iterators.hpp:844
IteratorCategoryT iterator_category
Definition iterators.hpp:752
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:805
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:855
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:868
decltype(*std::declval< const IteratorDecayTy & >()) reference
Definition iterators.hpp:632
auto operator->() const -> decltype(&*std::declval< const It & >())
Definition iterators.hpp:639
Definition iterators.hpp:603
IteratorT begin() const
Definition iterators.hpp:613
ReferenceProxy at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:644
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:609
IteratorT end() const
Definition iterators.hpp:616
bool empty() const
Definition iterators.hpp:619
ReferenceProxy operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:651
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:605
std::ptrdiff_t size() const
Definition iterators.hpp:655
typename std::decay< assembly::Instruction::Iterator >::type IteratorDecayTy
Definition iterators.hpp:606
Definition iterators.hpp:1037
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:1046
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:1043
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:151
size_t size() const
Definition iterators.hpp:271
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:225
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:215
ref_iterator operator++(int)
Definition iterators.hpp:145
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:159
ref_iterator cend() const
Definition iterators.hpp:259
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:166
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:209
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type & reference
Definition iterators.hpp:56
ref_iterator cbegin() const
Definition iterators.hpp:248
bool empty() const
Definition iterators.hpp:275
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:267
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:184
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:117
ref_iterator(ref_iterator< T2, U2, IT2 > &&other) noexcept
Definition iterators.hpp:102
ref_iterator end() const
Definition iterators.hpp:252
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:289
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:296
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:191
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:281
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:113
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:302
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:308
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
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:595
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:1025
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:675
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:1054
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:322
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:1064
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:1011
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:1017
pointee_iterator(U &&u)
Definition iterators.hpp:1014