ipcq 0.12.0
Loading...
Searching...
No Matches
iterator.hpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup ipcq_detail
4 * @brief Contains declarations for shm iterator.
5 * @copyright
6 * SPDX-FileCopyrightText: 2019-2020 European Southern Observatory (ESO)
7 *
8 * SPDX-License-Identifier: LGPL-3.0-only
9 */
10#ifndef IPCQ_DETAIL_ITERATOR_HPP_
11#define IPCQ_DETAIL_ITERATOR_HPP_
12
13namespace ipcq::detail {
14
15/**
16 * Provides standard iterator concept to ipcq queue.
17 *
18 * The special iterator value 0 means "end".
19 *
20 * @ingroup ipcq_detail
21 */
22template <class Buff, class Traits>
23struct Iterator {
24 /// @name Iterator concept
25 //@{
26 using iterator_category = std::random_access_iterator_tag;
27 using value_type = typename Traits::value_type;
28 using pointer = typename Traits::pointer;
29 using reference = typename Traits::reference;
30 using difference_type = typename Traits::difference_type;
31 using size_type = typename Traits::size_type;
32 //@}
33
34 const Buff* m_buff;
36
37 // @todo: Add generation!
38 Iterator() : m_buff(0), m_it(0){};
39 explicit Iterator(const Buff* buff, const pointer p) : m_buff(buff), m_it(p) {
40 }
41
42 /**
43 * Dereferencing operator
44 */
45 constexpr reference operator*() const noexcept {
46 return *m_it;
47 }
48
49 /**
50 * Dereferencing operator
51 */
52 constexpr pointer operator->() const noexcept {
53 return &(operator*());
54 }
55
56 /**
57 * Difference operator
58 */
59 template <class Traits0>
60 constexpr difference_type operator-(const Iterator<Buff, Traits0>& it) const noexcept {
61 return Linearize(*this) - Linearize(it);
62 }
63
64 /**
65 * Increment operator (prefix)
66 */
67 constexpr Iterator& operator++() noexcept {
68 m_buff->Increment(m_it);
69 if (m_it == m_buff->m_last) {
70 // This can also happen because writer catches up to reader. So that when reader next
71 // time increments its m_last_element it compares equally to "one past" last element.
72 m_it = nullptr; // end
73 }
74 return *this;
75 }
76
77 /**
78 * Increment operator (postfix)
79 */
80 constexpr Iterator operator++(int) noexcept {
81 auto tmp = *this;
82 ++*this;
83 return tmp;
84 }
85
86 /**
87 * Iterator addition
88 */
89 constexpr Iterator& operator+=(difference_type n) noexcept {
90 if (n > 0) {
91 m_it = m_buff->Add(m_it, n);
92 if (m_it == m_buff->m_last) {
93 m_it = nullptr;
94 }
95 } else if (n < 0) {
96 //*this -= -n;
97 assert(0);
98 }
99 return *this;
100 }
101
102 constexpr Iterator operator+(difference_type n) const noexcept {
103 auto tmp = *this;
104 tmp += n;
105 return tmp;
106 }
107
108 /**
109 * Random access operator
110 */
112 return *(*this + n);
113 }
114
115 template <class Traits0>
116 constexpr bool operator==(const Iterator<Buff, Traits0>& it) const noexcept {
117 return m_it == it.m_it;
118 }
119
120 template <class Traits0>
121 constexpr bool operator!=(const Iterator<Buff, Traits0>& it) const noexcept {
122 return m_it != it.m_it;
123 }
124
125 /**
126 * Less
127 */
128 template <class Traits0>
129 constexpr bool operator<(const Iterator<Buff, Traits0>& it) const noexcept {
130 return Linearize(*this) < Linearize(it);
131 }
132
133 /**
134 * Greater
135 */
136 template <class Traits0>
137 constexpr bool operator>(const Iterator<Buff, Traits0>& it) const noexcept {
138 return it < *this;
139 }
140
141 /**
142 * Less or equal
143 */
144 template <class Traits0>
145 constexpr bool operator<=(const Iterator<Buff, Traits0>& it) const noexcept {
146 return !(it < *this);
147 }
148
149 /**
150 * Greater or equal
151 */
152 template <class Traits0>
153 constexpr bool operator>=(const Iterator<Buff, Traits0>& it) const noexcept {
154 return !(*this < it);
155 }
156
157 /**
158 * Get a pointer which would point to the same element as the Iterator
159 * in case the circular buffer is linearized.
160 */
161 template <class Traits0>
162 constexpr typename Traits0::pointer
163 Linearize(const Iterator<Buff, Traits0>& it) const noexcept {
164 auto end = m_buff->m_buffer + m_buff->m_capacity;
165
166 return it.m_it == nullptr
167 ? m_buff->m_buffer + m_buff->m_size
168 : (it.m_it < m_buff->m_first ? it.m_it + (end - m_buff->m_first)
169 : m_buff->m_buffer + (it.m_it - m_buff->m_first));
170 }
171
172 // GCOVR_EXCL_START
173 std::ostream& Str(std::ostream& os) const noexcept {
174 os << "{ it=" << m_it - m_buff->m_buffer << ", first=" << m_buff->m_first - m_buff->m_buffer
175 << ", last=" << m_buff->m_last - m_buff->m_buffer << ", size=" << m_buff->m_size << " }";
176 return os;
177 }
178
179 friend std::ostream& operator<<(std::ostream& os, Iterator const& it) {
180 return it.Str(os);
181 }
182 // GCOVR_EXCL_STOP
183};
184
185} // namespace ipcq::detail
186#endif
typename Traits::pointer pointer
Definition iterator.hpp:28
constexpr Iterator operator++(int) noexcept
Increment operator (postfix)
Definition iterator.hpp:80
constexpr bool operator>(const Iterator< Buff, Traits0 > &it) const noexcept
Greater.
Definition iterator.hpp:137
constexpr Iterator operator+(difference_type n) const noexcept
Definition iterator.hpp:102
reference operator[](difference_type n) const
Random access operator.
Definition iterator.hpp:111
typename Traits::value_type value_type
Definition iterator.hpp:27
Iterator(const Buff *buff, const pointer p)
Definition iterator.hpp:39
constexpr bool operator<=(const Iterator< Buff, Traits0 > &it) const noexcept
Less or equal.
Definition iterator.hpp:145
constexpr Iterator & operator++() noexcept
Increment operator (prefix)
Definition iterator.hpp:67
constexpr Iterator & operator+=(difference_type n) noexcept
Iterator addition.
Definition iterator.hpp:89
std::ostream & Str(std::ostream &os) const noexcept
Definition iterator.hpp:173
typename Traits::reference reference
Definition iterator.hpp:29
constexpr reference operator*() const noexcept
Dereferencing operator.
Definition iterator.hpp:45
friend std::ostream & operator<<(std::ostream &os, Iterator const &it)
Definition iterator.hpp:179
std::random_access_iterator_tag iterator_category
Definition iterator.hpp:26
constexpr Traits0::pointer Linearize(const Iterator< Buff, Traits0 > &it) const noexcept
Get a pointer which would point to the same element as the Iterator in case the circular buffer is li...
Definition iterator.hpp:163
constexpr bool operator>=(const Iterator< Buff, Traits0 > &it) const noexcept
Greater or equal.
Definition iterator.hpp:153
constexpr bool operator==(const Iterator< Buff, Traits0 > &it) const noexcept
Definition iterator.hpp:116
constexpr bool operator<(const Iterator< Buff, Traits0 > &it) const noexcept
Less.
Definition iterator.hpp:129
constexpr bool operator!=(const Iterator< Buff, Traits0 > &it) const noexcept
Definition iterator.hpp:121
constexpr difference_type operator-(const Iterator< Buff, Traits0 > &it) const noexcept
Difference operator.
Definition iterator.hpp:60
typename Traits::size_type size_type
Definition iterator.hpp:31
constexpr pointer operator->() const noexcept
Dereferencing operator.
Definition iterator.hpp:52
typename Traits::difference_type difference_type
Definition iterator.hpp:30