IDA C++ SDK 9.2
Loading...
Searching...
No Matches
qiterator.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <iterator>
4#include <memory>
5
7{
8
9 // A minimal reverse-iterator adapter we own (no STL surface).
10 template <class It>
12 {
13 public:
14 using iterator_type = It;
15 using difference_type = typename std::iterator_traits<It>::difference_type;
16 using value_type = typename std::iterator_traits<It>::value_type;
17 using pointer = typename std::iterator_traits<It>::pointer;
18 using reference = typename std::iterator_traits<It>::reference;
19 using iterator_category = typename std::iterator_traits<It>::iterator_category;
20
21 constexpr qreverse_iterator() noexcept = default;
22 constexpr explicit qreverse_iterator(It it) noexcept : current_(it) {}
23
24 template <class U,
25 class = std::enable_if_t<std::is_convertible<U, It>::value>>
26 constexpr qreverse_iterator(qreverse_iterator<U> const &other) noexcept
27 : current_(other.base())
28 {
29 }
30
31 constexpr It base() const noexcept { return current_; }
32
33 constexpr reference operator*() const noexcept
34 {
35 It tmp = current_;
36 --tmp;
37 return *tmp;
38 }
39
40 constexpr pointer operator->() const noexcept
41 {
42 return std::addressof(operator*());
43 }
44
45 constexpr qreverse_iterator &operator++() noexcept
46 {
47 --current_;
48 return *this;
49 }
50
51 constexpr qreverse_iterator operator++(int) noexcept
52 {
53 qreverse_iterator tmp(*this);
54 --current_;
55 return tmp;
56 }
57
58 constexpr qreverse_iterator &operator--() noexcept
59 {
60 ++current_;
61 return *this;
62 }
63
64 constexpr qreverse_iterator operator--(int) noexcept
65 {
66 qreverse_iterator tmp(*this);
67 ++current_;
68 return tmp;
69 }
70
71 friend constexpr bool operator==(qreverse_iterator a, qreverse_iterator b) noexcept
72 {
73 return a.current_ == b.current_;
74 }
75
76 friend constexpr bool operator!=(qreverse_iterator a, qreverse_iterator b) noexcept
77 {
78 return !(a == b);
79 }
80
81 private:
82 It current_ {};
83 };
84
85} // namespace qiterator_detail
friend constexpr bool operator==(qreverse_iterator a, qreverse_iterator b) noexcept
Definition qiterator.hpp:71
constexpr qreverse_iterator operator--(int) noexcept
Definition qiterator.hpp:64
friend constexpr bool operator!=(qreverse_iterator a, qreverse_iterator b) noexcept
Definition qiterator.hpp:76
typename std::iterator_traits< It >::pointer pointer
Definition qiterator.hpp:17
constexpr qreverse_iterator() noexcept=default
typename std::iterator_traits< It >::value_type value_type
Definition qiterator.hpp:16
constexpr qreverse_iterator(qreverse_iterator< U > const &other) noexcept
Definition qiterator.hpp:26
typename std::iterator_traits< It >::iterator_category iterator_category
Definition qiterator.hpp:19
typename std::iterator_traits< It >::reference reference
Definition qiterator.hpp:18
constexpr qreverse_iterator operator++(int) noexcept
Definition qiterator.hpp:51
constexpr qreverse_iterator & operator--() noexcept
Definition qiterator.hpp:58
constexpr It base() const noexcept
Definition qiterator.hpp:31
constexpr qreverse_iterator & operator++() noexcept
Definition qiterator.hpp:45
It iterator_type
Definition qiterator.hpp:14
constexpr reference operator*() const noexcept
Definition qiterator.hpp:33
constexpr pointer operator->() const noexcept
Definition qiterator.hpp:40
typename std::iterator_traits< It >::difference_type difference_type
Definition qiterator.hpp:15
Definition qiterator.hpp:7