MySQL 9.7.0
Source Code Documentation
cyclic_buffer.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2022, 2026, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef MYSQL_HARNESS_UTILITY_CONTAINER_CYCLE_BUFFER_H_
27#define MYSQL_HARNESS_UTILITY_CONTAINER_CYCLE_BUFFER_H_
28
29#include <array>
30#include <cstdint>
31#include <iterator>
32
33namespace mysql_harness {
34namespace utility {
35namespace container {
36
37template <uint32_t buffer_size, typename Container>
40 using Cinterator = typename Container::iterator;
41 using Cpointer = typename Container::pointer;
42 using Cconst_interator = typename Container::const_iterator;
43 using Creference = typename Container::reference;
44 using Cconst_reference = typename Container::const_reference;
46
47 class Position {
48 public:
50 uint32_t flips_{0};
51
52 bool operator==(const Position &other) const {
53 return it_ == other.it_ && flips_ == other.flips_;
54 }
55 };
56
58 public:
62
64 uint32_t flips_{0};
65
66 bool operator==(const Const_position &other) const {
67 return it_ == other.it_ && flips_ == other.flips_;
68 }
69 };
70
71 void try_resize(std::array<value_type, buffer_size> &) {}
72
73 template <typename C>
74 void try_resize(C &c) {
75 c.resize(buffer_size);
76 }
77
78 public:
79 template <typename Pos = Position, typename Buffer = CycleBuffer,
80 typename Reference = Creference>
81 class Iterator {
82 public:
83 using iterator_category = std::bidirectional_iterator_tag;
85 using difference_type = long;
88
89 explicit Iterator(Pos position, Buffer *buffer)
90 : position_(position), buffer_{buffer} {}
91
93 ++position_.it_;
94 if (position_.it_ == buffer_->container_.end()) {
95 position_.it_ = buffer_->container_.begin();
96 ++position_.flips_;
97 }
98 return *this;
99 }
100
102 if (position_.it_ == buffer_->container_.begin()) {
103 position_.it_ = buffer_->container_.end();
104 --position_.it_;
105 --position_.flips_;
106 } else {
107 --position_.it_;
108 }
109 return *this;
110 }
111
113 Iterator retval = *this;
114 ++(*this);
115 return retval;
116 }
118 Iterator retval = *this;
119 --(*this);
120 return retval;
121 }
122
123 bool operator==(const Iterator &other) const {
124 return position_ == other.position_;
125 }
126
127 bool operator!=(Iterator other) const { return !(*this == other); }
128
129 Reference operator*() const { return *position_.it_; }
130
131 private:
133 Buffer *buffer_;
134 };
135
139
140 public:
143 begin_.it_ = container_.begin();
144 end_.it_ = container_.begin();
145 }
146
147 Container &container() { return container_; }
148
149 iterator begin() { return iterator(begin_, this); }
150 iterator end() { return iterator(end_, this); }
151
152 const_iterator begin() const { return const_iterator(begin_, this); }
153 const_iterator end() const { return const_iterator(end_, this); }
154
155 template <typename V>
156 void push_back(V &&v) {
157 Iterator<Position &> e{end_, this};
158 *e = std::forward<V>(v);
159 ++e;
160 if (elements_ != buffer_size) {
161 ++elements_;
162 } else {
164 ++b;
165 }
166 }
167
168 uint32_t size() const { return elements_; }
169
170 bool empty() const { return 0 == elements_; }
171
172 value_type &front() { return *begin(); }
173
174 value_type &back() { return *--end(); }
175
176 void pop_front() {
177 if (!elements_) return;
178
180 b++;
181 --elements_;
182 }
183
184 void pop_back() {
185 if (!elements_) return;
186
187 Iterator<Position &> e{end_, this};
188 e--;
189 --elements_;
190 }
191
192 private:
193 Container container_;
194 uint32_t elements_{0};
197};
198
199template <typename Type, uint32_t buffer_size>
201 : public CycleBuffer<buffer_size, std::array<Type, buffer_size>> {};
202
203} // namespace container
204} // namespace utility
205} // namespace mysql_harness
206
207#endif // MYSQL_HARNESS_UTILITY_CONTAINER_CYCLE_BUFFER_H_
Cconst_interator it_
Definition: cyclic_buffer.h:63
Const_position(const Position &p)
Definition: cyclic_buffer.h:61
Const_position(const Const_position &p)
Definition: cyclic_buffer.h:60
bool operator==(const Const_position &other) const
Definition: cyclic_buffer.h:66
Iterator & operator++()
Definition: cyclic_buffer.h:92
long difference_type
Definition: cyclic_buffer.h:85
bool operator==(const Iterator &other) const
Definition: cyclic_buffer.h:123
Iterator operator--(int)
Definition: cyclic_buffer.h:117
Cpointer pointer
Definition: cyclic_buffer.h:86
Reference operator*() const
Definition: cyclic_buffer.h:129
Iterator operator++(int)
Definition: cyclic_buffer.h:112
Creference reference
Definition: cyclic_buffer.h:87
Buffer * buffer_
Definition: cyclic_buffer.h:133
CycleBuffer::value_type value_type
Definition: cyclic_buffer.h:84
Iterator(Pos position, Buffer *buffer)
Definition: cyclic_buffer.h:89
bool operator!=(Iterator other) const
Definition: cyclic_buffer.h:127
std::bidirectional_iterator_tag iterator_category
Definition: cyclic_buffer.h:83
Iterator & operator--()
Definition: cyclic_buffer.h:101
Cinterator it_
Definition: cyclic_buffer.h:49
bool operator==(const Position &other) const
Definition: cyclic_buffer.h:52
uint32_t flips_
Definition: cyclic_buffer.h:50
iterator begin()
Definition: cyclic_buffer.h:149
void try_resize(std::array< value_type, buffer_size > &)
Definition: cyclic_buffer.h:71
const_iterator begin() const
Definition: cyclic_buffer.h:152
void push_back(V &&v)
Definition: cyclic_buffer.h:156
CycleBuffer()
Definition: cyclic_buffer.h:141
value_type & front()
Definition: cyclic_buffer.h:172
uint32_t size() const
Definition: cyclic_buffer.h:168
void pop_back()
Definition: cyclic_buffer.h:184
Iterator< Position > iterator
Definition: cyclic_buffer.h:136
value_type & back()
Definition: cyclic_buffer.h:174
void try_resize(C &c)
Definition: cyclic_buffer.h:74
Container container_
Definition: cyclic_buffer.h:193
typename Container::reference Creference
Definition: cyclic_buffer.h:43
Container & container()
Definition: cyclic_buffer.h:147
uint32_t elements_
Definition: cyclic_buffer.h:194
Position begin_
Definition: cyclic_buffer.h:195
typename Container::const_iterator Cconst_interator
Definition: cyclic_buffer.h:42
typename Container::pointer Cpointer
Definition: cyclic_buffer.h:41
typename Container::value_type value_type
Definition: cyclic_buffer.h:45
typename Container::iterator Cinterator
Definition: cyclic_buffer.h:40
iterator end()
Definition: cyclic_buffer.h:150
bool empty() const
Definition: cyclic_buffer.h:170
Position end_
Definition: cyclic_buffer.h:196
Iterator< Const_position, const CycleBuffer, Cconst_reference > const_iterator
Definition: cyclic_buffer.h:138
typename Container::const_reference Cconst_reference
Definition: cyclic_buffer.h:44
const_iterator end() const
Definition: cyclic_buffer.h:153
void pop_front()
Definition: cyclic_buffer.h:176
const char * p
Definition: ctype-mb.cc:1227
uint16_t value_type
Definition: vt100.h:184
Definition: atomics_array.h:39
Definition: common.h:44
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
size_t buffer_size(const ConstBufferSequence &buffers) noexcept
Definition: buffer.h:313