17#ifndef LIEF_ITERATORS_H
18#define LIEF_ITERATORS_H
31using decay_t =
typename std::decay<T>::type;
44template<class T, typename U = typename decay_t<T>::value_type,
51 using pointer =
typename std::remove_pointer<U>::type*;
52 using reference =
typename std::remove_pointer<U>::type&;
61 container_{std::forward<T>(container)}
63 it_ = std::begin(container_);
67 container_{copy.container_},
68 it_{std::
begin(container_)},
69 distance_{copy.distance_}
71 std::advance(it_, distance_);
83 std::swap(it_, other.it_);
84 std::swap(distance_, other.distance_);
101 if (it_ != std::begin(container_)) {
102 it_ = std::prev(it_);
116 std::advance(it_, movement);
117 distance_ += movement;
123 return (*
this) += -movement;
134 assert(n <
size() &&
"integrity error: out of bound");
139 no_const_this->it_ = std::begin(no_const_this->container_);
140 std::advance(no_const_this->it_, n);
144 no_const_this->it_ = std::begin(no_const_this->container_);
145 std::advance(no_const_this->it_, saved_dist);
163 return distance_ - rhs.distance_;
167 return (rhs - *
this) > 0;
177 return !(*
this < rhs);
182 return !(*
this > rhs);
195 it.it_ = std::end(it.container_);
196 it.distance_ = it.
size();
205 return (
size() == other.
size() && distance_ == other.distance_);
209 return !(*
this == other);
213 return container_.size();
217 return container_.empty();
225 template<
typename V = DT_VAL>
228 assert(*it_ &&
"integrity error: nullptr");
232 template<
typename V = DT_VAL>
239 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
256template<class T, typename U = typename decay_t<T>::value_type,
class CT =
typename std::add_const<T>::type>
261template<class T, typename U = typename decay_t<T>::value_type,
269 using pointer =
typename std::remove_pointer<U>::type*;
270 using reference =
typename std::remove_pointer<U>::type&;
277 using filter_t = std::function<bool (
const typename DT::value_type&)>;
280 container_{std::forward<T>(container)},
284 it_ = std::begin(container_);
286 filters_.push_back(filter),
287 it_ = std::begin(container_);
289 if (it_ != std::end(container_)) {
290 if (!std::all_of(std::begin(filters_), std::end(filters_), [
this] (
const filter_t& f) {
return f(*it_);})) {
297 container_{std::forward<T>(container)},
301 it_ = std::begin(container_);
303 if (it_ != std::end(container_)) {
304 if (!std::all_of(std::begin(filters_), std::end(filters_), [
this] (
const filter_t& f) {
return f(*it_);})) {
311 container_{std::forward<T>(container)},
314 it_ = std::begin(container_);
318 container_{copy.container_},
319 it_{std::
begin(container_)},
320 filters_{copy.filters_},
321 distance_{copy.distance_}
323 std::advance(it_, distance_);
333 std::swap(it_, other.it_);
334 std::swap(filters_, other.filters_);
335 std::swap(size_c_, other.size_c_);
336 std::swap(distance_, other.distance_);
341 filters_.push_back(func);
358 return {container_, filters_};
369 it_end.it_ = it_end.container_.end();
370 it_end.distance_ = it_end.container_.size();
384 template<
typename V = DT_VAL>
387 assert(*it_ &&
"integrity error: nullptr");
391 template<
typename V = DT_VAL>
404 assert(n <
size() &&
"integrity error: out of bound");
412 typename std::enable_if<!std::is_const<pointer_t>::value,
pointer_t>::type
422 if (filters_.empty()) {
423 return container_.size();
432 auto end_iter = std::end(it);
433 for (; it != end_iter; ++it) ++
size;
445 return (container_.size() == other.container_.size() && distance_ == other.distance_);
449 return !(*
this == other);
454 if (it_ == std::end(container_)) {
455 distance_ = container_.size();
460 it_ = std::next(it_);
462 }
while(it_ != std::end(container_) &&
463 !std::all_of(std::begin(filters_), std::end(filters_),
464 [
this] (
const filter_t& f) {
return f(*it_); }));
469 mutable size_t size_c_ = 0;
472 std::vector<filter_t> filters_;
477template<class T, typename U = typename decay_t<T>::value_type,
478 class CT =
typename std::add_const<T>::type>
485template <
typename IteratorT>
490 : begin_(std::forward<IteratorT>(it_begin)),
491 end_(std::forward<IteratorT>(it_end)) {}
493 IteratorT
begin()
const {
return begin_; }
494 IteratorT
end()
const {
return end_; }
495 bool empty()
const {
return begin_ == end_; }
497 typename IteratorT::value_type
at(
typename IteratorT::difference_type pos)
const {
498 static_assert(IsRandomAccess,
"at() needs random access iterator");
500 std::advance(it, pos);
504 typename IteratorT::value_type
operator[](
typename IteratorT::difference_type pos)
const {
509 return std::distance(begin_, end_);
514 IsRandomAccess = std::is_base_of<std::random_access_iterator_tag,
515 typename IteratorT::iterator_category>::value,
516 IsBidirectional = std::is_base_of<std::bidirectional_iterator_tag,
517 typename IteratorT::iterator_category>::value,
586template <
typename DerivedT,
typename IteratorCategoryT,
typename T,
587 typename DifferenceTypeT = std::ptrdiff_t,
typename PointerT = T *,
588 typename ReferenceT = T &>
599 IsRandomAccess = std::is_base_of<std::random_access_iterator_tag,
600 IteratorCategoryT>::value,
601 IsBidirectional = std::is_base_of<std::bidirectional_iterator_tag,
602 IteratorCategoryT>::value,
610 class ReferenceProxy {
615 ReferenceProxy(DerivedT I) : I(std::move(I)) {}
618 operator ReferenceT()
const {
return *I; }
626 friend iterator_facade_base;
630 template <
typename RefT>
631 PointerProxy(RefT &&R) : R(std::forward<RefT>(R)) {}
639 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
640 "Must pass the derived type to this template!");
643 "The '+' operator is only defined for random access iterators.");
644 DerivedT tmp = *
static_cast<const DerivedT *
>(
this);
648 friend DerivedT
operator+(DifferenceTypeT n,
const DerivedT &i) {
651 "The '+' operator is only defined for random access iterators.");
657 "The '-' operator is only defined for random access iterators.");
658 DerivedT tmp = *
static_cast<const DerivedT *
>(
this);
664 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
665 "Must pass the derived type to this template!");
666 return static_cast<DerivedT *
>(
this)->
operator+=(1);
669 DerivedT tmp = *
static_cast<DerivedT *
>(
this);
670 ++*
static_cast<DerivedT *
>(
this);
676 "The decrement operator is only defined for bidirectional iterators.");
677 return static_cast<DerivedT *
>(
this)->
operator-=(1);
682 "The decrement operator is only defined for bidirectional iterators.");
683 DerivedT tmp = *
static_cast<DerivedT *
>(
this);
684 --*
static_cast<DerivedT *
>(
this);
688#ifndef __cpp_impl_three_way_comparison
690 return !(
static_cast<const DerivedT &
>(*this) == RHS);
697 "Relational operators are only defined for random access iterators.");
698 return !(
static_cast<const DerivedT &
>(*this) < RHS) &&
699 !(
static_cast<const DerivedT &
>(*
this) == RHS);
704 "Relational operators are only defined for random access iterators.");
705 return !(
static_cast<const DerivedT &
>(*this) > RHS);
710 "Relational operators are only defined for random access iterators.");
711 return !(
static_cast<const DerivedT &
>(*this) < RHS);
715 return static_cast<const DerivedT *
>(
this)->
operator*();
718 static_assert(IsRandomAccess,
719 "Subscripting is only defined for random access iterators.");
720 return static_cast<const DerivedT *
>(
this)->
operator+(n);
730 typename DerivedT,
typename WrappedIteratorT,
731 typename IteratorCategoryT =
732 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
733 typename T =
typename std::iterator_traits<WrappedIteratorT>::value_type,
734 typename DifferenceTypeT =
735 typename std::iterator_traits<WrappedIteratorT>::difference_type,
736 typename PointerT =
typename std::conditional<
737 std::is_same<T,
typename std::iterator_traits<
738 WrappedIteratorT>::value_type>::value,
739 typename std::iterator_traits<WrappedIteratorT>::pointer, T *>,
740 typename ReferenceT =
typename std::conditional<
741 std::is_same<T,
typename std::iterator_traits<
742 WrappedIteratorT>::value_type>::value,
743 typename std::iterator_traits<WrappedIteratorT>::reference, T &>::type>
744class iterator_adaptor_base
746 DifferenceTypeT, PointerT, ReferenceT> {
747 using BaseT =
typename iterator_adaptor_base::iterator_facade_base;
752 iterator_adaptor_base() =
default;
754 explicit iterator_adaptor_base(WrappedIteratorT u) : I(std::move(u)) {
755 static_assert(std::is_base_of<iterator_adaptor_base, DerivedT>::value,
756 "Must pass the derived type to this template!");
759 const WrappedIteratorT &wrapped()
const {
return I; }
766 BaseT::IsRandomAccess,
767 "The '+=' operator is only defined for random access iterators.");
769 return *
static_cast<DerivedT *
>(
this);
773 BaseT::IsRandomAccess,
774 "The '-=' operator is only defined for random access iterators.");
776 return *
static_cast<DerivedT *
>(
this);
778 using BaseT::operator-;
781 BaseT::IsRandomAccess,
782 "The '-' operator is only defined for random access iterators.");
788 using BaseT::operator++;
791 return *
static_cast<DerivedT *
>(
this);
793 using BaseT::operator--;
796 BaseT::IsBidirectional,
797 "The decrement operator is only defined for bidirectional iterators.");
799 return *
static_cast<DerivedT *
>(
this);
803 const iterator_adaptor_base &RHS) {
804 return LHS.I == RHS.I;
807 const iterator_adaptor_base &RHS) {
809 BaseT::IsRandomAccess,
810 "Relational operators are only defined for random access iterators.");
811 return LHS.I < RHS.I;
826template <
typename WrappedIteratorT,
827 typename T =
typename std::remove_reference<
decltype(
828 **std::declval<WrappedIteratorT>())>::type>
830 : iterator_adaptor_base<
835 template <
typename U>
842template <
typename RangeT,
typename WrappedIteratorT =
843 decltype(std::begin(std::declval<RangeT>()))>
844iterator_range<pointee_iterator<WrappedIteratorT>>
847 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
848 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
851template <
typename WrappedIteratorT,
852 typename T =
decltype(&*std::declval<WrappedIteratorT>())>
854 : public iterator_adaptor_base<
869template <
typename RangeT,
typename WrappedIteratorT =
870 decltype(std::begin(std::declval<RangeT>()))>
871iterator_range<pointer_iterator<WrappedIteratorT>>
874 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
875 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
878template <
typename WrappedIteratorT,
879 typename T1 =
typename std::remove_reference<
decltype(
880 **std::declval<WrappedIteratorT>())>::type,
881 typename T2 =
typename std::add_pointer<T1>::type>
Iterator which return a ref on container's values given predicates.
Definition iterators.hpp:263
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:393
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:444
filter_iterator(const filter_iterator ©)
Definition iterators.hpp:317
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:403
filter_iterator cend() const
Definition iterators.hpp:375
typename std::remove_pointer< Symbol * >::type * pointer
Definition iterators.hpp:269
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:279
std::forward_iterator_tag iterator_category
Definition iterators.hpp:266
filter_iterator(T container)
Definition iterators.hpp:310
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:331
filter_iterator & operator++()
Definition iterators.hpp:346
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:413
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:296
filter_iterator end() const
Definition iterators.hpp:365
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:276
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:326
decay_t< Symbol * > value_type
Definition iterators.hpp:267
typename filter_iterator::reference ref_t
Definition iterators.hpp:275
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:380
filter_iterator begin() const
Definition iterators.hpp:357
bool empty() const
Definition iterators.hpp:439
Symbol * DT_VAL
Definition iterators.hpp:273
ptrdiff_t difference_type
Definition iterators.hpp:268
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:417
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:277
size_t size() const
Definition iterators.hpp:421
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:386
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:448
symbols_t & container_type
Definition iterators.hpp:272
filter_iterator operator++(int)
Definition iterators.hpp:351
decay_t< symbols_t & > DT
Definition iterators.hpp:274
filter_iterator cbegin() const
Definition iterators.hpp:361
filter_iterator & def(filter_t func)
Definition iterators.hpp:340
typename std::remove_pointer< Symbol * >::type & reference
Definition iterators.hpp:270
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:399
DerivedT & operator++()
Definition iterators.hpp:789
DerivedT & operator--()
Definition iterators.hpp:794
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:771
ReferenceT operator*() const
Definition iterators.hpp:814
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:806
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:802
DifferenceTypeT difference_type
Definition iterators.hpp:762
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:764
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:779
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:589
DifferenceTypeT difference_type
Definition iterators.hpp:593
PointerProxy operator->() const
Definition iterators.hpp:714
DerivedT & operator--()
Definition iterators.hpp:673
DerivedT operator++(int)
Definition iterators.hpp:668
T value_type
Definition iterators.hpp:592
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:648
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:694
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:717
ReferenceT reference
Definition iterators.hpp:595
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:707
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:654
DerivedT & operator++()
Definition iterators.hpp:663
PointerT pointer
Definition iterators.hpp:594
DerivedT operator--(int)
Definition iterators.hpp:679
IteratorCategoryT iterator_category
Definition iterators.hpp:591
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:638
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:689
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:701
Definition iterators.hpp:486
IteratorT begin() const
Definition iterators.hpp:493
IteratorT end() const
Definition iterators.hpp:494
IteratorT::value_type operator[](typename IteratorT::difference_type pos) const
Definition iterators.hpp:504
bool empty() const
Definition iterators.hpp:495
IteratorT::value_type at(typename IteratorT::difference_type pos) const
Definition iterators.hpp:497
iterator_range(IteratorT &&it_begin, IteratorT &&it_end)
Definition iterators.hpp:489
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:488
std::ptrdiff_t size() const
Definition iterators.hpp:508
Definition iterators.hpp:857
pointer_iterator()=default
T & operator*() const
Definition iterators.hpp:866
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:863
Iterator which returns reference on container's values.
Definition iterators.hpp:46
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:181
ref_iterator & operator--()
Definition iterators.hpp:100
size_t size() const
Definition iterators.hpp:212
ref_iterator & operator++()
Definition iterators.hpp:88
void swap(ref_iterator &other) noexcept
Definition iterators.hpp:80
bool operator<(const ref_iterator &rhs) const
Definition iterators.hpp:166
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:156
ref_iterator operator++(int)
Definition iterators.hpp:94
ref_iterator begin() const
Definition iterators.hpp:185
sections_t container_type
Definition iterators.hpp:54
typename ref_iterator::reference ref_t
Definition iterators.hpp:57
ref_iterator operator--(int)
Definition iterators.hpp:108
ref_iterator cend() const
Definition iterators.hpp:200
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:115
std::bidirectional_iterator_tag iterator_category
Definition iterators.hpp:48
ptrdiff_t difference_type
Definition iterators.hpp:50
ref_iterator operator+(typename ref_iterator::difference_type n) const
Definition iterators.hpp:150
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type & reference
Definition iterators.hpp:52
ref_iterator cbegin() const
Definition iterators.hpp:189
bool empty() const
Definition iterators.hpp:216
ref_iterator & operator=(ref_iterator other)
Definition iterators.hpp:75
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type * pointer
Definition iterators.hpp:51
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:208
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:128
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:171
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:176
ref_iterator(const ref_iterator ©)
Definition iterators.hpp:66
ref_iterator end() const
Definition iterators.hpp:193
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:227
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:234
ref_iterator & operator-=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:122
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:133
decay_t< typename decay_t< sections_t >::value_type > value_type
Definition iterators.hpp:49
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:221
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:162
typename decay_t< sections_t >::value_type DT_VAL
Definition iterators.hpp:55
typename ref_iterator::pointer pointer_t
Definition iterators.hpp:58
ref_iterator(T container)
Definition iterators.hpp:60
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:240
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:244
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:204
decay_t< sections_t > DT
Definition iterators.hpp:56
@ T
Definition AcceleratorCodes.hpp:97
LIEF namespace.
Definition Abstract/Binary.hpp:40
filter_iterator< CT, U, typename decay_t< CT >::const_iterator > const_filter_iterator
Iterator which return a const ref on container's values given predicates.
Definition iterators.hpp:479
typename std::add_lvalue_reference< T >::type add_lvalue_reference_t
Definition iterators.hpp:40
typename std::remove_const< T >::type remove_const_t
Definition iterators.hpp:37
typename std::decay< T >::type decay_t
Definition iterators.hpp:31
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:845
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:524
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:872
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which return const ref on container's values.
Definition iterators.hpp:257
typename std::add_const< T >::type add_const_t
Definition iterators.hpp:34
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:882
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:833
pointee_iterator()=default
T & operator*() const
Definition iterators.hpp:839
pointee_iterator(U &&u)
Definition iterators.hpp:836