17#ifndef LIEF_ITERATORS_H
18#define LIEF_ITERATORS_H
51template<
class T,
bool = std::is_reference_v<T>>
59 container_{std::addressof(container)} {}
78 container_(std::move(container)) {}
91template<
class Ref,
class U,
class IT>
93 if constexpr (std::is_pointer_v<U>) {
94 assert(*it &&
"integrity error: nullptr");
95 return static_cast<Ref
>(**it);
97 return const_cast<Ref
>(*it);
101template<
class T,
class U,
class Category>
103 std::conditional_t<std::is_reference_v<T> || std::is_pointer_v<U>, Category,
104 std::input_iterator_tag>;
119template<class T, typename U = typename decay_t<T>::value_type,
122 template<
class,
typename,
class>
129 using value_type = std::remove_cv_t<std::remove_pointer_t<decay_t<U>>>;
143 container_{other.container_},
145 distance_{other.distance_} {
150 container_{std::move(other.container_)},
152 distance_{other.distance_} {
154 other.container_ = {};
170 template<
class T2,
typename U2,
class IT2,
171 typename = std::enable_if_t<
172 !std::is_same_v<ref_iterator, ref_iterator<T2, U2, IT2>> &&
176 distance_{other.distance_} {
177 if (
auto* container = other.container_.get(); container !=
nullptr) {
178 if constexpr (std::is_reference_v<T>) {
183 it_ = std::next(std::begin(*container_.get()), distance_);
191 container_{std::forward<
details::container_arg_t<T>>(container)},
192 it_(std::
begin(*container_.get())) {}
195 std::swap(container_, other.container_);
196 std::swap(it_, other.it_);
197 std::swap(distance_, other.distance_);
204 it_ = std::next(it_);
216 if (it_ != std::begin(*container_.get())) {
217 it_ = std::prev(it_);
233 std::advance(it_, movement);
234 distance_ += movement;
242 return (*
this) += -movement;
255 assert(n <
size() &&
"integrity error: out of bound");
273 return distance_ - rhs.distance_;
277 return (rhs - *
this) > 0;
287 return !(*
this < rhs);
292 return !(*
this > rhs);
296 if (container_.get() ==
nullptr) {
308 if (
auto* container = it.container_.get(); container !=
nullptr) {
309 it.it_ = std::end(*container);
326 if constexpr (std::is_reference_v<T>) {
327 return container_.get() == other.container_.get() &&
328 distance_ == other.distance_;
330 return size() == other.
size() && distance_ == other.distance_;
335 return !(*
this == other);
339 const auto* container = container_.get();
340 return container !=
nullptr ? container->size() : 0;
344 const auto* container = container_.get();
345 return container ==
nullptr || container->empty();
372 if constexpr (!std::is_reference_v<T>) {
373 it_ = std::next(std::begin(*container_.get()), distance_);
377 details::container_storage<T> container_;
384template<class T, typename U = typename decay_t<T>::value_type,
385 class CT = std::add_const_t<T>>
391template<class T, typename U = typename decay_t<T>::value_type,
399 using value_type = std::remove_cv_t<std::remove_pointer_t<decay_t<U>>>;
409 using filter_t = std::function<bool(
const typename DT::value_type&)>;
416 size_c_{other.size_c_},
417 size_cached_{other.size_cached_},
418 container_{other.container_},
420 filters_{other.filters_},
421 distance_{other.distance_} {
426 size_c_{other.size_c_},
427 size_cached_{other.size_cached_},
428 container_{std::move(other.container_)},
430 filters_{std::move(other.filters_)},
431 distance_{other.distance_} {
434 other.size_cached_ =
false;
435 other.container_ = {};
455 container_{std::forward<
details::container_arg_t<T>>(container)},
456 it_(std::
begin(*container_.get())),
458 filters_.push_back(std::move(filter));
460 if (it_ != std::end(*container_.get()) && !match()) {
467 const std::vector<filter_t>& filters) :
468 container_{std::forward<
details::container_arg_t<T>>(container)},
469 it_(std::
begin(*container_.get())),
471 if (it_ != std::end(*container_.get()) && !match()) {
478 container_{std::forward<
details::container_arg_t<T>>(container)},
479 it_(std::
begin(*container_.get())),
483 std::swap(container_, other.container_);
484 std::swap(it_, other.it_);
485 std::swap(filters_, other.filters_);
486 std::swap(size_c_, other.size_c_);
487 std::swap(size_cached_, other.size_cached_);
488 std::swap(distance_, other.distance_);
495 filters_.push_back(func);
497 size_cached_ =
false;
513 if (container_.get() ==
nullptr) {
516 return {*container_.get(), filters_};
524 if (container_.get() ==
nullptr) {
531 it_end.it_ = std::end(*it_end.container_.get());
564 assert(n <
size() &&
"integrity error: out of bound");
585 if (filters_.empty()) {
586 return container_size();
595 auto end_iter = it.
end();
596 for (; it != end_iter; ++it) {
606 if (filters_.empty()) {
607 return container_size() == 0;
619 if constexpr (std::is_reference_v<T>) {
620 return container_.get() == other.container_.get() &&
621 distance_ == other.distance_;
623 return container_size() == other.container_size() &&
624 distance_ == other.distance_;
629 return !(*
this == other);
633 size_t container_size()
const {
634 const auto* container = container_.get();
635 return container !=
nullptr ? container->size() : 0;
639 return std::all_of(std::begin(filters_), std::end(filters_),
640 [
this](
const filter_t& f) {
return f(*it_); });
644 if (it_ == std::end(*container_.get())) {
650 it_ = std::next(it_);
652 }
while (it_ != std::end(*container_.get()) && !match());
656 if constexpr (!std::is_reference_v<T>) {
657 it_ = std::next(std::begin(*container_.get()), distance_);
662 mutable size_t size_c_ = 0;
663 mutable bool size_cached_ =
false;
664 details::container_storage<T> container_;
666 std::vector<filter_t> filters_;
671template<class T, typename U = typename decay_t<T>::value_type,
672 class CT = std::add_const_t<T>>
680template<
typename IteratorT>
688 begin_(std::forward<T>(it_begin)),
689 end_(std::forward<T>(it_end)) {}
698 return begin_ == end_;
701 class ReferenceProxy {
707 it_(std::move(it)) {}
710 using reference =
decltype(*std::declval<const IteratorDecayTy&>());
716 template<
class It = IteratorDecayTy>
717 auto operator->() const -> decltype(&*std::declval<const It&>()) {
722 ReferenceProxy
at(
typename IteratorDecayTy::difference_type pos)
const {
723 static_assert(IsRandomAccess,
"at() needs random access iterator");
725 std::advance(it, pos);
726 return ReferenceProxy(std::move(it));
729 ReferenceProxy
operator[](
typename IteratorDecayTy::difference_type pos)
const {
734 return std::distance(begin_, end_);
738 static constexpr bool IsRandomAccess =
739 std::is_base_of_v<std::random_access_iterator_tag,
740 typename IteratorDecayTy::iterator_category>;
741 static constexpr bool IsBidirectional =
742 std::is_base_of_v<std::bidirectional_iterator_tag,
743 typename IteratorDecayTy::iterator_category>;
757#if LIEF_HAS_STD_RANGES
758template<
typename IteratorT>
760 std::ranges::enable_borrowed_range<LIEF::iterator_range<IteratorT>> =
true;
765template<
class T,
typename U,
class IT>
766inline constexpr bool std::ranges::enable_view<LIEF::ref_iterator<T, U, IT>> =
767 std::is_reference_v<T>;
769template<
class T,
typename U,
class IT>
770inline constexpr bool std::ranges::enable_view<LIEF::filter_iterator<T, U, IT>> =
771 std::is_reference_v<T>;
776template<
class T,
typename U,
class IT>
778 std::ranges::enable_borrowed_range<LIEF::ref_iterator<T, U, IT>> =
779 std::is_reference_v<T> || std::is_pointer_v<U>;
781template<
class T,
typename U,
class IT>
783 std::ranges::enable_borrowed_range<LIEF::filter_iterator<T, U, IT>> =
784 std::is_reference_v<T> || std::is_pointer_v<U>;
847template<
typename DerivedT,
typename IteratorCategoryT,
typename T,
848 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT =
T*,
849 typename ReferenceT =
T&>
850class iterator_facade_base {
852 iterator_facade_base() =
default;
862 static constexpr bool IsRandomAccess =
863 std::is_base_of_v<std::random_access_iterator_tag, IteratorCategoryT>;
864 static constexpr bool IsBidirectional =
865 std::is_base_of_v<std::bidirectional_iterator_tag, IteratorCategoryT>;
872 class ReferenceProxy {
873 friend iterator_facade_base;
881 operator ReferenceT()
const {
895 template<
typename RefT>
896 PointerProxy(RefT&& R) :
897 R(std::forward<RefT>(R)) {}
907 static_assert(std::is_base_of_v<iterator_facade_base, DerivedT>,
908 "Must pass the derived type to this template!");
909 static_assert(IsRandomAccess,
910 "The '+' operator is only defined for random access iterators.");
916 static_assert(IsRandomAccess,
917 "The '+' operator is only defined for random access iterators.");
921 static_assert(IsRandomAccess,
922 "The '-' operator is only defined for random access iterators.");
929 static_assert(std::is_base_of_v<iterator_facade_base, DerivedT>,
930 "Must pass the derived type to this template!");
931 return static_cast<DerivedT*
>(
this)->
operator+=(1);
941 "The decrement operator is only defined for bidirectional iterators."
943 return static_cast<DerivedT*
>(
this)->
operator-=(1);
948 "The decrement operator is only defined for bidirectional iterators."
955#ifndef __cpp_impl_three_way_comparison
957 return !(
static_cast<const DerivedT&
>(*this) == RHS);
964 "Relational operators are only defined for random access iterators."
966 return !(
static_cast<const DerivedT&
>(*this) < RHS) &&
967 !(
static_cast<const DerivedT&
>(*
this) == RHS);
972 "Relational operators are only defined for random access iterators."
974 return !(
static_cast<const DerivedT&
>(*this) > RHS);
979 "Relational operators are only defined for random access iterators."
981 return !(
static_cast<const DerivedT&
>(*this) < RHS);
985 return static_cast<const DerivedT*
>(
this)->
operator*();
988 static_assert(IsRandomAccess,
989 "Subscripting is only defined for random access iterators.");
990 return static_cast<const DerivedT*
>(
this)->
operator+(n);
999template<
typename DerivedT,
typename WrappedIteratorT,
1000 typename IteratorCategoryT =
1001 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
1002 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
1003 typename DifferenceTypeT =
1004 typename std::iterator_traits<WrappedIteratorT>::difference_type,
1005 typename PointerT = std::conditional_t<
1006 std::is_same_v<T, typename std::iterator_traits<WrappedIteratorT>::
1008 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
1010 typename ReferenceT = std::conditional_t<
1011 std::is_same_v<T, typename std::iterator_traits<WrappedIteratorT>::
1013 typename std::iterator_traits<WrappedIteratorT>::reference, T&
1015class iterator_adaptor_base
1016 :
public iterator_facade_base<DerivedT, IteratorCategoryT, T, DifferenceTypeT,
1017 PointerT, ReferenceT> {
1018 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
1023 iterator_adaptor_base() =
default;
1025 explicit iterator_adaptor_base(WrappedIteratorT u) :
1027 static_assert(std::is_base_of_v<iterator_adaptor_base, DerivedT>,
1028 "Must pass the derived type to this template!");
1031 const WrappedIteratorT& wrapped()
const {
1040 BaseT::IsRandomAccess,
1041 "The '+=' operator is only defined for random access iterators."
1044 return *
static_cast<DerivedT*
>(
this);
1048 BaseT::IsRandomAccess,
1049 "The '-=' operator is only defined for random access iterators."
1052 return *
static_cast<DerivedT*
>(
this);
1054 using BaseT::operator-;
1056 static_assert(BaseT::IsRandomAccess,
1057 "The '-' operator is only defined for random access iterators.");
1063 using BaseT::operator++;
1066 return *
static_cast<DerivedT*
>(
this);
1068 using BaseT::operator--;
1071 BaseT::IsBidirectional,
1072 "The decrement operator is only defined for bidirectional iterators."
1075 return *
static_cast<DerivedT*
>(
this);
1079 const iterator_adaptor_base& RHS) {
1080 return LHS.I == RHS.I;
1083 const iterator_adaptor_base& RHS) {
1085 BaseT::IsRandomAccess,
1086 "Relational operators are only defined for random access iterators."
1088 return LHS.I < RHS.I;
1105template<
typename WrappedIteratorT,
1107 std::remove_reference_t<decltype(**std::declval<WrappedIteratorT>())>>
1109 : iterator_adaptor_base<
1114 template<
typename U>
1123template<
typename RangeT,
1124 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1125iterator_range<pointee_iterator<WrappedIteratorT>>
1128 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
1129 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
1132template<
typename WrappedIteratorT,
1133 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
1135 : public iterator_adaptor_base<
1148 return Ptr = &*this->I;
1152template<
typename RangeT,
1153 typename WrappedIteratorT =
decltype(std::begin(std::declval<RangeT>()))>
1154iterator_range<pointer_iterator<WrappedIteratorT>>
1157 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
1158 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
1161template<
typename WrappedIteratorT,
1163 std::remove_reference_t<decltype(**std::declval<WrappedIteratorT>())>,
1164 typename T2 = std::add_pointer_t<T1>>
container_t arg_t
Definition iterators.hpp:74
container_t * get() const
Definition iterators.hpp:80
container_storage()=default
std::remove_const_t< T > container_t
Definition iterators.hpp:73
container_storage(arg_t container)
Definition iterators.hpp:77
Storage of the container iterated by a ref_iterator or a filter_iterator.
Definition iterators.hpp:52
container_t * get() const
The container or a nullptr if the storage is default-constructed.
Definition iterators.hpp:62
T arg_t
Definition iterators.hpp:55
container_storage(arg_t container)
Definition iterators.hpp:58
container_storage()=default
std::remove_reference_t< T > container_t
Definition iterators.hpp:54
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:393
std::enable_if_t<!std::is_const_v< pointer_t >, pointer_t > operator->()
Definition iterators.hpp:574
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:618
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:563
filter_iterator cend() const
Definition iterators.hpp:537
std::forward_iterator_tag iterator_category
Definition iterators.hpp:396
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator*()
Definition iterators.hpp:545
filter_iterator & operator=(const filter_iterator &other)
Definition iterators.hpp:440
filter_iterator(details::container_arg_t< T > container, filter_t filter)
Definition iterators.hpp:454
add_const_t< ref_t > operator*() const
Definition iterators.hpp:551
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:482
filter_iterator & operator++()
Definition iterators.hpp:501
filter_iterator(details::container_arg_t< T > container, const std::vector< filter_t > &filters)
Definition iterators.hpp:466
filter_iterator end() const
Definition iterators.hpp:523
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:408
std::remove_pointer_t< Symbol * > * pointer
Definition iterators.hpp:401
typename filter_iterator::reference ref_t
Definition iterators.hpp:407
filter_iterator(const filter_iterator &other)
Definition iterators.hpp:415
bool is_end() const
Definition iterators.hpp:541
filter_iterator begin() const
Definition iterators.hpp:512
bool empty() const
Definition iterators.hpp:605
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator[](size_t n)
Definition iterators.hpp:557
Symbol * DT_VAL
Definition iterators.hpp:405
ptrdiff_t difference_type
Definition iterators.hpp:400
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:580
std::remove_cv_t< std::remove_pointer_t< decay_t< Symbol * > > > value_type
Definition iterators.hpp:399
filter_iterator()=default
Create an iterator that is not associated with a container. It behaves as an empty range.
size_t size() const
Definition iterators.hpp:584
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:628
filter_iterator(details::container_arg_t< T > container)
Definition iterators.hpp:477
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:409
std::remove_pointer_t< Symbol * > & reference
Definition iterators.hpp:402
details::iterator_concept_t< symbols_t &, Symbol *, std::forward_iterator_tag > iterator_concept
Definition iterators.hpp:397
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:425
symbols_t & container_type
Definition iterators.hpp:404
filter_iterator operator++(int)
Definition iterators.hpp:506
decay_t< symbols_t & > DT
Definition iterators.hpp:406
filter_iterator cbegin() const
Definition iterators.hpp:519
filter_iterator & def(filter_t func)
Definition iterators.hpp:494
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:446
DerivedT & operator++()
Definition iterators.hpp:1064
DerivedT & operator--()
Definition iterators.hpp:1069
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:1046
ReferenceT operator*() const
Definition iterators.hpp:1091
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:1082
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:1078
DifferenceTypeT difference_type
Definition iterators.hpp:1036
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:1038
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:1055
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:850
DifferenceTypeT difference_type
Definition iterators.hpp:857
PointerProxy operator->() const
Definition iterators.hpp:984
DerivedT & operator--()
Definition iterators.hpp:938
DerivedT operator++(int)
Definition iterators.hpp:933
T value_type
Definition iterators.hpp:856
friend DerivedT
Definition iterators.hpp:851
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:915
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:961
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:987
ReferenceT reference
Definition iterators.hpp:859
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:976
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:920
DerivedT & operator++()
Definition iterators.hpp:928
PointerT pointer
Definition iterators.hpp:858
DerivedT operator--(int)
Definition iterators.hpp:945
IteratorCategoryT iterator_category
Definition iterators.hpp:855
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:906
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:956
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:969
decltype(*std::declval< const IteratorDecayTy & >()) reference
Definition iterators.hpp:710
auto operator->() const -> decltype(&*std::declval< const It & >())
Definition iterators.hpp:717
friend iterator_range
Definition iterators.hpp:702
Definition iterators.hpp:681
IteratorT begin() const
Definition iterators.hpp:691
ReferenceProxy at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:722
std::decay_t< assembly::Instruction::Iterator > IteratorDecayTy
Definition iterators.hpp:684
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:687
IteratorT end() const
Definition iterators.hpp:694
bool empty() const
Definition iterators.hpp:697
ReferenceProxy operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:729
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:683
std::ptrdiff_t size() const
Definition iterators.hpp:733
Definition iterators.hpp:1138
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:1147
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:1144
Iterator which returns reference on container's values.
Definition iterators.hpp:121
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:291
ref_iterator & operator--()
Definition iterators.hpp:215
add_const_t< ref_t > operator*() const
Definition iterators.hpp:354
size_t size() const
Definition iterators.hpp:338
ref_iterator & operator++()
Definition iterators.hpp:203
void swap(ref_iterator &other) noexcept
Definition iterators.hpp:194
bool operator<(const ref_iterator &rhs) const
Definition iterators.hpp:276
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:266
ref_iterator operator++(int)
Definition iterators.hpp:209
ref_iterator begin() const
Definition iterators.hpp:295
sections_t container_type
Definition iterators.hpp:134
typename ref_iterator::reference ref_t
Definition iterators.hpp:137
ref_iterator operator--(int)
Definition iterators.hpp:223
ref_iterator cend() const
Definition iterators.hpp:315
ref_iterator(const ref_iterator &other)
Definition iterators.hpp:142
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:230
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator[](size_t n)
Definition iterators.hpp:247
std::remove_pointer_t< typename decay_t< sections_t >::value_type > & reference
Definition iterators.hpp:132
std::bidirectional_iterator_tag iterator_category
Definition iterators.hpp:126
std::enable_if_t<!std::is_const_v< ref_t >, remove_const_t< ref_t > > operator*()
Definition iterators.hpp:348
ref_iterator(ref_iterator &&other) noexcept
Definition iterators.hpp:149
ptrdiff_t difference_type
Definition iterators.hpp:130
ref_iterator(details::container_arg_t< T > container)
Definition iterators.hpp:190
ref_iterator operator+(typename ref_iterator::difference_type n) const
Definition iterators.hpp:260
ref_iterator cbegin() const
Definition iterators.hpp:302
bool empty() const
Definition iterators.hpp:343
std::remove_cv_t< std::remove_pointer_t< decay_t< typename decay_t< sections_t >::value_type > > > value_type
Definition iterators.hpp:129
ref_iterator & operator=(ref_iterator &&other) noexcept
Definition iterators.hpp:165
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:334
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:281
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:286
ref_iterator end() const
Definition iterators.hpp:306
ref_iterator & operator-=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:239
ref_iterator(const ref_iterator< T2, U2, IT2 > &other)
Definition iterators.hpp:175
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:254
std::remove_pointer_t< typename decay_t< sections_t >::value_type > * pointer
Definition iterators.hpp:131
std::enable_if_t<!std::is_const_v< pointer_t >, pointer_t > operator->()
Definition iterators.hpp:358
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:272
typename decay_t< sections_t >::value_type DT_VAL
Definition iterators.hpp:135
typename ref_iterator::pointer pointer_t
Definition iterators.hpp:138
details::iterator_concept_t< sections_t, typename decay_t< sections_t >::value_type, std::bidirectional_iterator_tag > iterator_concept
Definition iterators.hpp:127
friend class ref_iterator
Definition iterators.hpp:123
bool is_end() const
Definition iterators.hpp:319
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:364
ref_iterator & operator=(const ref_iterator &other)
Definition iterators.hpp:159
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:323
decay_t< sections_t > DT
Definition iterators.hpp:136
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
@ T
Definition AcceleratorCodes.hpp:97
Definition Abstract/DebugInfo.hpp:27
Ref deref(const IT &it)
Definition iterators.hpp:92
typename container_storage< T >::arg_t container_arg_t
Definition iterators.hpp:89
std::conditional_t< std::is_reference_v< T >||std::is_pointer_v< U >, Category, std::input_iterator_tag > iterator_concept_t
Definition iterators.hpp:102
LIEF namespace.
Definition Abstract/Binary.hpp:42
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:673
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:1126
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:751
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:1155
std::remove_const_t< T > remove_const_t
Definition iterators.hpp:39
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:386
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:1165
std::decay_t< T > decay_t
Definition iterators.hpp:33
std::add_const_t< T > add_const_t
Definition iterators.hpp:36
std::add_lvalue_reference_t< T > add_lvalue_reference_t
Definition iterators.hpp:42
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:1112
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:1118
pointee_iterator(U &&u)
Definition iterators.hpp:1115