LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
iterators.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2026 R. Thomas
2 * Copyright 2017 - 2026 Quarkslab
3 * Copyright 2017 - 2021, NVIDIA CORPORATION. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17#ifndef LIEF_ITERATORS_H
18#define LIEF_ITERATORS_H
19#include <cstddef>
20#include <cassert>
21#include <iterator>
22#include <functional>
23#include <algorithm>
24#include <type_traits>
25#include <vector>
26
27namespace LIEF {
28
29template<class T>
30using decay_t = typename std::decay<T>::type;
31
32template<class T>
33using add_const_t = typename std::add_const<T>::type;
34
35template<class T>
36using remove_const_t = typename std::remove_const<T>::type;
37
38template<class T>
39using add_lvalue_reference_t = typename std::add_lvalue_reference<T>::type;
40
41
43template<class T, typename U = typename decay_t<T>::value_type,
44 class ITERATOR_T = typename decay_t<T>::iterator>
46 public:
47 using iterator_category = std::bidirectional_iterator_tag;
49 using difference_type = ptrdiff_t;
50 using pointer = typename std::remove_pointer<U>::type*;
51 using reference = typename std::remove_pointer<U>::type&;
52
53 using container_type = T; // e.g. std::vector<Section*>&
54 using DT_VAL = U; // e.g. Section*
55 using DT = decay_t<T>; // e.g. std::vector<Section>
58
59 ref_iterator(ref_iterator&& other) noexcept :
60 container_{std::forward<T>(other.container_)},
61 it_{std::begin(container_)},
62 distance_{other.distance_} {
63 std::advance(it_, distance_);
64 }
65
66 ref_iterator& operator=(ref_iterator&& other) noexcept {
67 if (other == &this) {
68 return *this;
69 }
70 container_ = std::forward<T>(other.container_);
71 it_ = std::begin(other.container_);
72 distance_ = other.distance_;
73 std::advance(it_, distance_);
74 return *this;
75 }
76
77 ~ref_iterator() = default;
78
79 ref_iterator(T container) :
80 container_{std::forward<T>(container)},
81 it_(std::begin(container_)) {}
82
84 container_{copy.container_},
85 it_{std::begin(container_)},
86 distance_{copy.distance_} {
87 std::advance(it_, distance_);
88 }
89
91 swap(other);
92 return *this;
93 }
94
95 void swap(ref_iterator& other) noexcept {
96 std::swap(
97 const_cast<add_lvalue_reference_t<remove_const_t<DT>>>(container_),
98 const_cast<add_lvalue_reference_t<remove_const_t<DT>>>(other.container_)
99 );
100 std::swap(it_, other.it_);
101 std::swap(distance_, other.distance_);
102 }
103
104
106 it_ = std::next(it_);
107 distance_++;
108 return *this;
109 }
110
112 ref_iterator retval = *this;
113 ++(*this);
114 return retval;
115 }
116
118 if (it_ != std::begin(container_)) {
119 it_ = std::prev(it_);
120 distance_--;
121 }
122 return *this;
123 }
124
126 ref_iterator retval = *this;
127 --(*this);
128 return retval;
129 }
130
131
133 operator+=(const typename ref_iterator::difference_type& movement) {
134 std::advance(it_, movement);
135 distance_ += movement;
136 return *this;
137 }
138
139
141 operator-=(const typename ref_iterator::difference_type& movement) {
142 return (*this) += -movement;
143 }
144
145
146 typename std::enable_if<!std::is_const<ref_t>::value,
148 operator[](size_t n) {
149 return const_cast<remove_const_t<ref_t>>(
150 static_cast<const ref_iterator*>(this)->operator[](n)
151 );
152 }
153
154
156 assert(n < size() && "integrity error: out of bound");
157
158 auto* no_const_this = const_cast<ref_iterator*>(this);
159
160 typename ref_iterator::difference_type saved_dist =
161 std::distance(std::begin(no_const_this->container_), no_const_this->it_);
162 no_const_this->it_ = std::begin(no_const_this->container_);
163 std::advance(no_const_this->it_, n);
164
165 auto&& v = const_cast<add_const_t<ref_t>>(no_const_this->operator*());
166
167 no_const_this->it_ = std::begin(no_const_this->container_);
168 std::advance(no_const_this->it_, saved_dist);
169
170 return v;
171 }
172
174 ref_iterator tmp = *this;
175 return tmp += n;
176 }
177
178
180 ref_iterator tmp = *this;
181 return tmp -= n;
182 }
183
184
186 return distance_ - rhs.distance_;
187 }
188
189 bool operator<(const ref_iterator& rhs) const {
190 return (rhs - *this) > 0;
191 }
192
193
194 bool operator>(const ref_iterator& rhs) const {
195 return rhs < *this;
196 }
197
198
199 bool operator>=(const ref_iterator& rhs) const {
200 return !(*this < rhs);
201 }
202
203
204 bool operator<=(const ref_iterator& rhs) const {
205 return !(*this > rhs);
206 }
207
209 return container_;
210 }
211
213 return begin();
214 }
215
217 ref_iterator it = ref_iterator{container_};
218 it.it_ = std::end(it.container_);
219 it.distance_ = it.size();
220 return it;
221 }
222
224 return end();
225 }
226
227 bool operator==(const ref_iterator& other) const {
228 return (size() == other.size() && distance_ == other.distance_);
229 }
230
231 bool operator!=(const ref_iterator& other) const {
232 return !(*this == other);
233 }
234
235 size_t size() const {
236 return container_.size();
237 }
238
239 bool empty() const {
240 return container_.empty();
241 }
242
243 typename std::enable_if<!std::is_const<ref_t>::value,
246 return const_cast<remove_const_t<ref_t>>(
247 static_cast<const ref_iterator*>(this)->operator*()
248 );
249 }
250
251 template<typename V = DT_VAL>
252 typename std::enable_if<std::is_pointer<V>::value, add_const_t<ref_t>>::type
253 operator*() const {
254 assert(*it_ && "integrity error: nullptr");
255 return const_cast<add_const_t<ref_t>>(static_cast<ref_t>(**it_));
256 }
257
258 template<typename V = DT_VAL>
259 typename std::enable_if<!std::is_pointer<V>::value, add_const_t<ref_t>>::type
260 operator*() const {
261 return const_cast<add_const_t<ref_t>>(*(it_));
262 }
263
264
265 typename std::enable_if<!std::is_const<pointer_t>::value, pointer_t>::type
267 return const_cast<remove_const_t<pointer_t>>(
268 static_cast<const ref_iterator*>(this)->operator->()
269 );
270 }
271
273 return const_cast<add_const_t<pointer_t>>(&(operator*()));
274 }
275
276 protected:
277 T container_;
278 ITERATOR_T it_;
279 typename ref_iterator::difference_type distance_{};
280};
281
282
284template<class T, typename U = typename decay_t<T>::value_type,
285 class CT = typename std::add_const<T>::type>
288
289
291template<class T, typename U = typename decay_t<T>::value_type,
292 class ITERATOR_T = typename decay_t<T>::iterator>
294
295 public:
296 using iterator_category = std::forward_iterator_tag;
298 using difference_type = ptrdiff_t;
299 using pointer = typename std::remove_pointer<U>::type*;
300 using reference = typename std::remove_pointer<U>::type&;
301
302 using container_type = T;
303 using DT_VAL = U;
304 using DT = decay_t<T>;
307 using filter_t = std::function<bool(const typename DT::value_type&)>;
308
310 size_c_(other.size_c_),
311 size_cached_(other.size_cached_),
312 container_(std::forward<T>(other.container_)),
313 it_(std::begin(container_)),
314 filters_{std::move(other.filters_)},
315 distance_(other.distance_) {
316 std::advance(it_, distance_);
317 }
318
320 if (this == &other) {
321 return *this;
322 }
323
324 size_c_ = other.size_c_;
325 size_cached_ = other.size_cached_;
326 container_ = std::forward<T>(other.container_);
327 it_ = std::begin(container_);
328 filters_ = std::move(other.filters_);
329 distance_ = other.distance_;
330
331 std::advance(it_, distance_);
332
333 return *this;
334 }
335
336 ~filter_iterator() = default;
337
338 filter_iterator(T container, filter_t filter) :
339 container_{std::forward<T>(container)},
340 it_(std::begin(container_)),
341 filters_{} {
342
343
344 filters_.push_back(filter);
345
346 if (it_ != std::end(container_)) {
347 if (!std::all_of(std::begin(filters_), std::end(filters_),
348 [this](const filter_t& f) { return f(*it_); }))
349 {
350 next();
351 }
352 }
353 }
354
355 filter_iterator(T container, const std::vector<filter_t>& filters) :
356 container_{std::forward<T>(container)},
357 it_(std::begin(container_)),
358 filters_{filters} {
359
360
361 if (it_ != std::end(container_)) {
362 if (!std::all_of(std::begin(filters_), std::end(filters_),
363 [this](const filter_t& f) { return f(*it_); }))
364 {
365 next();
366 }
367 }
368 }
369
370 filter_iterator(T container) :
371 container_{std::forward<T>(container)},
372 it_(std::begin(container_)),
373 filters_{} {}
374
376 container_{copy.container_},
377 it_{std::begin(container_)},
378 filters_{copy.filters_},
379 distance_{copy.distance_} {
380 std::advance(it_, distance_);
381 }
382
384 swap(other);
385 return *this;
386 }
387
388 void swap(filter_iterator& other) noexcept {
389 std::swap(const_cast<remove_const_t<DT>&>(container_),
390 const_cast<remove_const_t<DT>&>(other.container_));
391 std::swap(it_, other.it_);
392 std::swap(filters_, other.filters_);
393 std::swap(size_c_, other.size_c_);
394 std::swap(size_cached_, other.size_cached_);
395 std::swap(distance_, other.distance_);
396 }
397
398
400 filters_.push_back(func);
401 size_c_ = 0;
402 size_cached_ = false;
403 return *this;
404 }
405
407 next();
408 return *this;
409 }
410
412 filter_iterator retval = *this;
413 ++(*this);
414 return retval;
415 }
416
418 return {container_, filters_};
419 }
420
422 return begin();
423 }
424
426 // we don't need filter for the end iterator
427 filter_iterator it_end{container_};
428
429 it_end.it_ = it_end.container_.end();
430 it_end.distance_ = it_end.container_.size();
431
432 return it_end;
433 }
434
436 return end();
437 }
438
439 typename std::enable_if<!std::is_const<ref_t>::value,
442 return const_cast<remove_const_t<ref_t>>(
443 static_cast<const filter_iterator*>(this)->operator*()
444 );
445 }
446
447 template<typename V = DT_VAL>
448 typename std::enable_if<std::is_pointer<V>::value, add_const_t<ref_t>>::type
449 operator*() const {
450 assert(*it_ && "integrity error: nullptr");
451 return const_cast<add_const_t<ref_t>>(static_cast<ref_t>(**it_));
452 }
453
454 template<typename V = DT_VAL>
455 typename std::enable_if<!std::is_pointer<V>::value, add_const_t<ref_t>>::type
456 operator*() const {
457 return const_cast<add_const_t<ref_t>>(*(it_));
458 }
459
460
461 typename std::enable_if<!std::is_const<ref_t>::value,
463 operator[](size_t n) {
464 return const_cast<remove_const_t<ref_t>>(
465 static_cast<const filter_iterator*>(this)->operator[](n)
466 );
467 }
468
470 assert(n < size() && "integrity error: out of bound");
471
472 auto it = begin();
473 std::advance(it, n);
474 return const_cast<add_const_t<ref_t>>(*it);
475 }
476
477
478 typename std::enable_if<!std::is_const<pointer_t>::value, pointer_t>::type
480 return const_cast<remove_const_t<pointer_t>>(
481 static_cast<const filter_iterator*>(this)->operator->()
482 );
483 }
484
486 return const_cast<add_const_t<pointer_t>>(&(operator*()));
487 }
488
489 size_t size() const {
490 if (filters_.empty()) {
491 return container_.size();
492 }
493
494 if (size_cached_) {
495 return size_c_;
496 }
497 filter_iterator it = begin();
498 size_t size = 0;
499
500 auto end_iter = it.end();
501 for (; it != end_iter; ++it) {
502 ++size;
503 }
504 size_c_ = size;
505 size_cached_ = true;
506 return size_c_;
507 }
508
509
510 bool empty() const {
511 if (filters_.empty()) {
512 return container_.empty();
513 }
514
515 if (size_cached_) {
516 return size_c_ == 0;
517 }
518
519 return begin() == end();
520 }
521
522
523 bool operator==(const filter_iterator& other) const {
524 return (container_.size() == other.container_.size() &&
525 distance_ == other.distance_);
526 }
527
528 bool operator!=(const filter_iterator& other) const {
529 return !(*this == other);
530 }
531
532 protected:
533 void next() {
534 if (it_ == std::end(container_)) {
535 distance_ = container_.size();
536 return;
537 }
538
539 do {
540 it_ = std::next(it_);
541 distance_++;
542 } while (it_ != std::end(container_) &&
543 !std::all_of(std::begin(filters_), std::end(filters_),
544 [this](const filter_t& f) { return f(*it_); }));
545 }
546
547
548 mutable size_t size_c_ = 0;
549 mutable bool size_cached_ = false;
550 T container_;
551 ITERATOR_T it_;
552 std::vector<filter_t> filters_;
553 typename filter_iterator::difference_type distance_ = 0;
554};
555
557template<class T, typename U = typename decay_t<T>::value_type,
558 class CT = typename std::add_const<T>::type>
561
562// ----------------------------------------------------------------------------
563// This part is taken from LLVM
564// ----------------------------------------------------------------------------
565
566template<typename IteratorT>
568 public:
569 using IteratorTy = IteratorT;
570 using IteratorDecayTy = typename std::decay<IteratorT>::type;
571
572 template<class T>
573 iterator_range(T&& it_begin, T&& it_end) :
574 begin_(std::forward<T>(it_begin)),
575 end_(std::forward<T>(it_end)) {}
576
577 IteratorT begin() const {
578 return begin_;
579 }
580 IteratorT end() const {
581 return end_;
582 }
583 bool empty() const {
584 return begin_ == end_;
585 }
586
587 typename IteratorDecayTy::value_type
588 at(typename IteratorDecayTy::difference_type pos) const {
589 static_assert(IsRandomAccess, "at() needs random access iterator");
590 auto it = begin_;
591 std::advance(it, pos);
592 return *it;
593 }
594
595 typename IteratorDecayTy::value_type
596 operator[](typename IteratorDecayTy::difference_type pos) const {
597 return at(pos);
598 }
599
600 std::ptrdiff_t size() const {
601 return std::distance(begin_, end_);
602 }
603
604 protected:
605 enum {
606 IsRandomAccess =
607 std::is_base_of<std::random_access_iterator_tag,
608 typename IteratorDecayTy::iterator_category>::value,
609 IsBidirectional =
610 std::is_base_of<std::bidirectional_iterator_tag,
611 typename IteratorDecayTy::iterator_category>::value,
612 };
613
614 private:
615 IteratorT begin_;
616 IteratorT end_;
617};
618
619template<class T>
621 return iterator_range<T>(std::forward<T>(x), std::forward<T>(y));
622}
623
624
682template<typename DerivedT, typename IteratorCategoryT, typename T,
683 typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T*,
684 typename ReferenceT = T&>
686 public:
687 using iterator_category = IteratorCategoryT;
688 using value_type = T;
689 using difference_type = DifferenceTypeT;
690 using pointer = PointerT;
691 using reference = ReferenceT;
692
693 protected:
694 enum {
695 IsRandomAccess =
696 std::is_base_of<std::random_access_iterator_tag, IteratorCategoryT>::value,
697 IsBidirectional =
698 std::is_base_of<std::bidirectional_iterator_tag, IteratorCategoryT>::value,
699 };
700
706 class ReferenceProxy {
708
709 DerivedT I;
710
711 ReferenceProxy(DerivedT I) :
712 I(std::move(I)) {}
713
714 public:
715 operator ReferenceT() const {
716 return *I;
717 }
718 };
719
724 class PointerProxy {
725 friend iterator_facade_base;
726
727 ReferenceT R;
728
729 template<typename RefT>
730 PointerProxy(RefT&& R) : // NOLINT(bugprone-forwarding-reference-overload)
731 R(std::forward<RefT>(R)) {}
732
733 public:
734 PointerT operator->() const {
735 return &R;
736 }
737 };
738
739 public:
740 DerivedT operator+(DifferenceTypeT n) const {
741 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
742 "Must pass the derived type to this template!");
743 static_assert(IsRandomAccess,
744 "The '+' operator is only defined for random access iterators.");
745 DerivedT tmp = *static_cast<const DerivedT*>(this);
746 tmp += n;
747 return tmp;
748 }
749 friend DerivedT operator+(DifferenceTypeT n, const DerivedT& i) {
750 static_assert(IsRandomAccess,
751 "The '+' operator is only defined for random access iterators.");
752 return i + n;
753 }
754 DerivedT operator-(DifferenceTypeT n) const {
755 static_assert(IsRandomAccess,
756 "The '-' operator is only defined for random access iterators.");
757 DerivedT tmp = *static_cast<const DerivedT*>(this);
758 tmp -= n;
759 return tmp;
760 }
761
762 DerivedT& operator++() {
763 static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
764 "Must pass the derived type to this template!");
765 return static_cast<DerivedT*>(this)->operator+=(1);
766 }
767 DerivedT operator++(int) {
768 DerivedT tmp = *static_cast<DerivedT*>(this);
769 ++*static_cast<DerivedT*>(this);
770 return tmp;
771 }
772 DerivedT& operator--() {
773 static_assert(
774 IsBidirectional,
775 "The decrement operator is only defined for bidirectional iterators."
776 );
777 return static_cast<DerivedT*>(this)->operator-=(1);
778 }
779 DerivedT operator--(int) {
780 static_assert(
781 IsBidirectional,
782 "The decrement operator is only defined for bidirectional iterators."
783 );
784 DerivedT tmp = *static_cast<DerivedT*>(this);
785 --*static_cast<DerivedT*>(this);
786 return tmp;
787 }
788
789#ifndef __cpp_impl_three_way_comparison
790 bool operator!=(const DerivedT& RHS) const {
791 return !(static_cast<const DerivedT&>(*this) == RHS);
792 }
793#endif
794
795 bool operator>(const DerivedT& RHS) const {
796 static_assert(
797 IsRandomAccess,
798 "Relational operators are only defined for random access iterators."
799 );
800 return !(static_cast<const DerivedT&>(*this) < RHS) &&
801 !(static_cast<const DerivedT&>(*this) == RHS);
802 }
803 bool operator<=(const DerivedT& RHS) const {
804 static_assert(
805 IsRandomAccess,
806 "Relational operators are only defined for random access iterators."
807 );
808 return !(static_cast<const DerivedT&>(*this) > RHS);
809 }
810 bool operator>=(const DerivedT& RHS) const {
811 static_assert(
812 IsRandomAccess,
813 "Relational operators are only defined for random access iterators."
814 );
815 return !(static_cast<const DerivedT&>(*this) < RHS);
816 }
817
818 PointerProxy operator->() const {
819 return static_cast<const DerivedT*>(this)->operator*();
820 }
821 ReferenceProxy operator[](DifferenceTypeT n) const {
822 static_assert(IsRandomAccess,
823 "Subscripting is only defined for random access iterators.");
824 return static_cast<const DerivedT*>(this)->operator+(n);
825 }
826};
827
833template<typename DerivedT, typename WrappedIteratorT,
834 typename IteratorCategoryT =
835 typename std::iterator_traits<WrappedIteratorT>::iterator_category,
836 typename T = typename std::iterator_traits<WrappedIteratorT>::value_type,
837 typename DifferenceTypeT =
838 typename std::iterator_traits<WrappedIteratorT>::difference_type,
839 typename PointerT = typename std::conditional<
840 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
841 value_type>::value,
842 typename std::iterator_traits<WrappedIteratorT>::pointer, T*
843 >::type,
844 typename ReferenceT = typename std::conditional<
845 std::is_same<T, typename std::iterator_traits<WrappedIteratorT>::
846 value_type>::value,
847 typename std::iterator_traits<WrappedIteratorT>::reference, T&
848 >::type>
849class iterator_adaptor_base
850 : public iterator_facade_base<DerivedT, IteratorCategoryT, T, DifferenceTypeT,
851 PointerT, ReferenceT> {
852 using BaseT = typename iterator_adaptor_base::iterator_facade_base;
853
854 protected:
855 WrappedIteratorT I;
856
857 iterator_adaptor_base() = default;
858
859 explicit iterator_adaptor_base(WrappedIteratorT u) :
860 I(std::move(u)) {
861 static_assert(std::is_base_of<iterator_adaptor_base, DerivedT>::value,
862 "Must pass the derived type to this template!");
863 }
864
865 const WrappedIteratorT& wrapped() const {
866 return I;
867 }
868
869 public:
870 using difference_type = DifferenceTypeT;
871
873 static_assert(
874 BaseT::IsRandomAccess,
875 "The '+=' operator is only defined for random access iterators."
876 );
877 I += n;
878 return *static_cast<DerivedT*>(this);
879 }
881 static_assert(
882 BaseT::IsRandomAccess,
883 "The '-=' operator is only defined for random access iterators."
884 );
885 I -= n;
886 return *static_cast<DerivedT*>(this);
887 }
888 using BaseT::operator-;
889 difference_type operator-(const DerivedT& RHS) const {
890 static_assert(BaseT::IsRandomAccess,
891 "The '-' operator is only defined for random access iterators.");
892 return I - RHS.I;
893 }
894
895 // We have to explicitly provide ++ and -- rather than letting the facade
896 // forward to += because WrappedIteratorT might not support +=.
897 using BaseT::operator++;
898 DerivedT& operator++() {
899 ++I;
900 return *static_cast<DerivedT*>(this);
901 }
902 using BaseT::operator--;
903 DerivedT& operator--() {
904 static_assert(
905 BaseT::IsBidirectional,
906 "The decrement operator is only defined for bidirectional iterators."
907 );
908 --I;
909 return *static_cast<DerivedT*>(this);
910 }
911
912 friend bool operator==(const iterator_adaptor_base& LHS,
913 const iterator_adaptor_base& RHS) {
914 return LHS.I == RHS.I;
915 }
916 friend bool operator<(const iterator_adaptor_base& LHS,
917 const iterator_adaptor_base& RHS) {
918 static_assert(
919 BaseT::IsRandomAccess,
920 "Relational operators are only defined for random access iterators."
921 );
922 return LHS.I < RHS.I;
923 }
924
925 ReferenceT operator*() const {
926 return *I;
927 }
928};
929
939template<typename WrappedIteratorT,
940 typename T = typename std::
941 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type>
943 : iterator_adaptor_base<
944 pointee_iterator<WrappedIteratorT, T>, WrappedIteratorT,
945 typename std::iterator_traits<WrappedIteratorT>::iterator_category, T
946 > {
947 pointee_iterator() = default;
948 template<typename U>
949 pointee_iterator(U&& u) : // NOLINT(bugprone-forwarding-reference-overload)
950 pointee_iterator::iterator_adaptor_base(std::forward<U>(u)) {}
951
952 T& operator*() const {
953 return **this->I;
954 }
955};
956
957template<typename RangeT,
958 typename WrappedIteratorT = decltype(std::begin(std::declval<RangeT>()))>
959iterator_range<pointee_iterator<WrappedIteratorT>>
960 make_pointee_range(RangeT&& Range) {
961 using PointeeIteratorT = pointee_iterator<WrappedIteratorT>;
962 return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))),
963 PointeeIteratorT(std::end(std::forward<RangeT>(Range))));
964}
965
966template<typename WrappedIteratorT,
967 typename T = decltype(&*std::declval<WrappedIteratorT>())>
969 : public iterator_adaptor_base<
970 pointer_iterator<WrappedIteratorT, T>, WrappedIteratorT,
971 typename std::iterator_traits<WrappedIteratorT>::iterator_category, T
972 > {
973 mutable T Ptr;
974
975 public:
976 pointer_iterator() = default;
977
978 explicit pointer_iterator(WrappedIteratorT u) :
979 pointer_iterator::iterator_adaptor_base(std::move(u)) {}
980
981 T& operator*() const {
982 return Ptr = &*this->I;
983 }
984};
985
986template<typename RangeT,
987 typename WrappedIteratorT = decltype(std::begin(std::declval<RangeT>()))>
988iterator_range<pointer_iterator<WrappedIteratorT>>
989 make_pointer_range(RangeT&& Range) {
990 using PointerIteratorT = pointer_iterator<WrappedIteratorT>;
991 return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))),
992 PointerIteratorT(std::end(std::forward<RangeT>(Range))));
993}
994
995template<typename WrappedIteratorT,
996 typename T1 = typename std::
997 remove_reference<decltype(**std::declval<WrappedIteratorT>())>::type,
998 typename T2 = typename std::add_pointer<T1>::type>
1001
1002}
1003
1004#endif
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:293
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:456
bool operator==(const filter_iterator &other) const
Definition iterators.hpp:523
filter_iterator(const filter_iterator &copy)
Definition iterators.hpp:375
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:469
filter_iterator cend() const
Definition iterators.hpp:435
typename std::remove_pointer< Symbol * >::type * pointer
Definition iterators.hpp:299
filter_iterator(T container, filter_t filter)
Definition iterators.hpp:338
std::forward_iterator_tag iterator_category
Definition iterators.hpp:296
filter_iterator(T container)
Definition iterators.hpp:370
void swap(filter_iterator &other) noexcept
Definition iterators.hpp:388
filter_iterator & operator++()
Definition iterators.hpp:406
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:479
filter_iterator(T container, const std::vector< filter_t > &filters)
Definition iterators.hpp:355
filter_iterator end() const
Definition iterators.hpp:425
typename filter_iterator::pointer pointer_t
Definition iterators.hpp:306
filter_iterator & operator=(filter_iterator other)
Definition iterators.hpp:383
decay_t< Symbol * > value_type
Definition iterators.hpp:297
typename filter_iterator::reference ref_t
Definition iterators.hpp:305
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:441
filter_iterator begin() const
Definition iterators.hpp:417
bool empty() const
Definition iterators.hpp:510
Symbol * DT_VAL
Definition iterators.hpp:303
ptrdiff_t difference_type
Definition iterators.hpp:298
~filter_iterator()=default
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:485
size_t size() const
Definition iterators.hpp:489
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:449
bool operator!=(const filter_iterator &other) const
Definition iterators.hpp:528
std::function< bool(const typename DT::value_type &)> filter_t
Definition iterators.hpp:307
filter_iterator(filter_iterator &&other) noexcept
Definition iterators.hpp:309
symbols_t & container_type
Definition iterators.hpp:302
filter_iterator operator++(int)
Definition iterators.hpp:411
decay_t< symbols_t & > DT
Definition iterators.hpp:304
filter_iterator cbegin() const
Definition iterators.hpp:421
filter_iterator & def(filter_t func)
Definition iterators.hpp:399
typename std::remove_pointer< Symbol * >::type & reference
Definition iterators.hpp:300
filter_iterator & operator=(filter_iterator &&other) noexcept
Definition iterators.hpp:319
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:463
DerivedT & operator++()
Definition iterators.hpp:898
DerivedT & operator--()
Definition iterators.hpp:903
DerivedT & operator-=(difference_type n)
Definition iterators.hpp:880
ReferenceT operator*() const
Definition iterators.hpp:925
friend bool operator<(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:916
friend bool operator==(const iterator_adaptor_base &LHS, const iterator_adaptor_base &RHS)
Definition iterators.hpp:912
DifferenceTypeT difference_type
Definition iterators.hpp:870
DerivedT & operator+=(difference_type n)
Definition iterators.hpp:872
difference_type operator-(const DerivedT &RHS) const
Definition iterators.hpp:889
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterators.hpp:685
DifferenceTypeT difference_type
Definition iterators.hpp:689
PointerProxy operator->() const
Definition iterators.hpp:818
DerivedT & operator--()
Definition iterators.hpp:772
DerivedT operator++(int)
Definition iterators.hpp:767
T value_type
Definition iterators.hpp:688
friend DerivedT operator+(DifferenceTypeT n, const DerivedT &i)
Definition iterators.hpp:749
bool operator>(const DerivedT &RHS) const
Definition iterators.hpp:795
ReferenceProxy operator[](DifferenceTypeT n) const
Definition iterators.hpp:821
ReferenceT reference
Definition iterators.hpp:691
bool operator>=(const DerivedT &RHS) const
Definition iterators.hpp:810
DerivedT operator-(DifferenceTypeT n) const
Definition iterators.hpp:754
DerivedT & operator++()
Definition iterators.hpp:762
PointerT pointer
Definition iterators.hpp:690
DerivedT operator--(int)
Definition iterators.hpp:779
IteratorCategoryT iterator_category
Definition iterators.hpp:687
DerivedT operator+(DifferenceTypeT n) const
Definition iterators.hpp:740
bool operator!=(const DerivedT &RHS) const
Definition iterators.hpp:790
bool operator<=(const DerivedT &RHS) const
Definition iterators.hpp:803
Definition iterators.hpp:567
IteratorT begin() const
Definition iterators.hpp:577
iterator_range(T &&it_begin, T &&it_end)
Definition iterators.hpp:573
IteratorT end() const
Definition iterators.hpp:580
bool empty() const
Definition iterators.hpp:583
IteratorDecayTy::value_type at(typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:588
assembly::Instruction::Iterator IteratorTy
Definition iterators.hpp:569
IteratorDecayTy::value_type operator[](typename IteratorDecayTy::difference_type pos) const
Definition iterators.hpp:596
std::ptrdiff_t size() const
Definition iterators.hpp:600
typename std::decay< assembly::Instruction::Iterator >::type IteratorDecayTy
Definition iterators.hpp:570
Definition iterators.hpp:972
T & operator*() const
Definition iterators.hpp:981
pointer_iterator(WrappedIteratorT u)
Definition iterators.hpp:978
Iterator which returns reference on container's values.
Definition iterators.hpp:45
bool operator<=(const ref_iterator &rhs) const
Definition iterators.hpp:204
ref_iterator & operator--()
Definition iterators.hpp:117
size_t size() const
Definition iterators.hpp:235
ref_iterator & operator++()
Definition iterators.hpp:105
void swap(ref_iterator &other) noexcept
Definition iterators.hpp:95
bool operator<(const ref_iterator &rhs) const
Definition iterators.hpp:189
ref_iterator operator-(typename ref_iterator::difference_type n) const
Definition iterators.hpp:179
ref_iterator operator++(int)
Definition iterators.hpp:111
ref_iterator begin() const
Definition iterators.hpp:208
sections_t container_type
Definition iterators.hpp:53
typename ref_iterator::reference ref_t
Definition iterators.hpp:56
ref_iterator operator--(int)
Definition iterators.hpp:125
ref_iterator cend() const
Definition iterators.hpp:223
ref_iterator & operator+=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:133
std::bidirectional_iterator_tag iterator_category
Definition iterators.hpp:47
ref_iterator(ref_iterator &&other) noexcept
Definition iterators.hpp:59
ptrdiff_t difference_type
Definition iterators.hpp:49
ref_iterator operator+(typename ref_iterator::difference_type n) const
Definition iterators.hpp:173
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type & reference
Definition iterators.hpp:51
ref_iterator cbegin() const
Definition iterators.hpp:212
bool empty() const
Definition iterators.hpp:239
ref_iterator & operator=(ref_iterator other)
Definition iterators.hpp:90
typename std::remove_pointer< typename decay_t< sections_t >::value_type >::type * pointer
Definition iterators.hpp:50
ref_iterator & operator=(ref_iterator &&other) noexcept
Definition iterators.hpp:66
bool operator!=(const ref_iterator &other) const
Definition iterators.hpp:231
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator[](size_t n)
Definition iterators.hpp:148
bool operator>(const ref_iterator &rhs) const
Definition iterators.hpp:194
bool operator>=(const ref_iterator &rhs) const
Definition iterators.hpp:199
ref_iterator(const ref_iterator &copy)
Definition iterators.hpp:83
ref_iterator end() const
Definition iterators.hpp:216
std::enable_if< std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:253
std::enable_if<!std::is_pointer< V >::value, add_const_t< ref_t > >::type operator*() const
Definition iterators.hpp:260
ref_iterator & operator-=(const typename ref_iterator::difference_type &movement)
Definition iterators.hpp:141
add_const_t< ref_t > operator[](size_t n) const
Definition iterators.hpp:155
decay_t< typename decay_t< sections_t >::value_type > value_type
Definition iterators.hpp:48
std::enable_if<!std::is_const< ref_t >::value, remove_const_t< ref_t > >::type operator*()
Definition iterators.hpp:245
ref_iterator::difference_type operator-(const ref_iterator &rhs) const
Definition iterators.hpp:185
typename decay_t< sections_t >::value_type DT_VAL
Definition iterators.hpp:54
typename ref_iterator::pointer pointer_t
Definition iterators.hpp:57
ref_iterator(T container)
Definition iterators.hpp:79
~ref_iterator()=default
std::enable_if<!std::is_const< pointer_t >::value, pointer_t >::type operator->()
Definition iterators.hpp:266
add_const_t< pointer_t > operator->() const
Definition iterators.hpp:272
bool operator==(const ref_iterator &other) const
Definition iterators.hpp:227
decay_t< sections_t > DT
Definition iterators.hpp:55
@ 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:39
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:559
typename std::remove_const< T >::type remove_const_t
Definition iterators.hpp:36
typename std::decay< T >::type decay_t
Definition iterators.hpp:30
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition iterators.hpp:960
iterator_range< T > make_range(T &&x, T &&y)
Definition iterators.hpp:620
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterators.hpp:989
typename std::add_const< T >::type add_const_t
Definition iterators.hpp:33
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:286
pointer_iterator< pointee_iterator< WrappedIteratorT, T1 >, T2 > raw_pointer_iterator
Definition iterators.hpp:999
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterators.hpp:946
T & operator*() const
Definition iterators.hpp:952
pointee_iterator(U &&u)
Definition iterators.hpp:949