MySQL 9.3.0
Source Code Documentation
cyclic_buffer.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2022, 2025, 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 ROUTER_SRC_REST_MRS_SRC_HELPER_CONTAINER_CYCLIC_BUFFER_H_
27#define ROUTER_SRC_REST_MRS_SRC_HELPER_CONTAINER_CYCLIC_BUFFER_H_
28
29#include <array>
30#include <iterator>
31
32namespace helper {
33namespace container {
34
35template <uint32_t buffer_size, typename Container>
38 using Cinterator = typename Container::iterator;
39 using Cpointer = typename Container::pointer;
40 using Cconst_interator = typename Container::const_iterator;
41 using Creference = typename Container::reference;
42 using Cconst_reference = typename Container::const_reference;
44
45 class Position {
46 public:
48 uint32_t flips_{0};
49
50 bool operator==(const Position &other) const {
51 return it_ == other.it_ && flips_ == other.flips_;
52 }
53 };
54
56 public:
60
62 uint32_t flips_{0};
63
64 bool operator==(const Const_position &other) const {
65 return it_ == other.it_ && flips_ == other.flips_;
66 }
67 };
68
69 void try_resize(std::array<value_type, buffer_size> &) {}
70
71 template <typename C>
72 void try_resize(C &c) {
73 c.resize(buffer_size);
74 }
75
76 public:
77 template <typename Pos = Position, typename Buffer = CycleBuffer,
78 typename Reference = Creference>
79 class Iterator {
80 public:
81 using iterator_category = std::bidirectional_iterator_tag;
83 using difference_type = long;
86
87 explicit Iterator(Pos position, Buffer *buffer)
88 : position_(position), buffer_{buffer} {}
89
91 ++position_.it_;
92 if (position_.it_ == buffer_->container_.end()) {
93 position_.it_ = buffer_->container_.begin();
94 ++position_.flips_;
95 }
96 return *this;
97 }
98
100 if (position_.it_ == buffer_->container_.begin()) {
101 position_.it_ = buffer_->container_.end();
102 --position_.it_;
103 --position_.flips_;
104 } else {
105 --position_.it_;
106 }
107 return *this;
108 }
109
111 Iterator retval = *this;
112 ++(*this);
113 return retval;
114 }
116 Iterator retval = *this;
117 --(*this);
118 return retval;
119 }
120
121 bool operator==(const Iterator &other) const {
122 return position_ == other.position_;
123 }
124
125 bool operator!=(Iterator other) const { return !(*this == other); }
126
127 Reference operator*() const { return *position_.it_; }
128
129 private:
131 Buffer *buffer_;
132 };
133
137
138 public:
141 begin_.it_ = container_.begin();
142 end_.it_ = container_.begin();
143 }
144
145 Container &container() { return container_; }
146
147 iterator begin() { return iterator(begin_, this); }
148 iterator end() { return iterator(end_, this); }
149
150 const_iterator begin() const { return const_iterator(begin_, this); }
151 const_iterator end() const { return const_iterator(end_, this); }
152
153 template <typename V>
154 void push_back(V &&v) {
155 Iterator<Position &> e{end_, this};
156 *e = std::forward<V>(v);
157 ++e;
158 if (elements_ != buffer_size) {
159 ++elements_;
160 } else {
162 ++b;
163 }
164 }
165
166 uint32_t size() const { return elements_; }
167
168 bool empty() const { return 0 == elements_; }
169
170 value_type &front() { return *begin(); }
171
172 value_type &back() { return *--end(); }
173
174 void pop_front() {
175 if (!elements_) return;
176
178 b++;
179 --elements_;
180 }
181
182 void pop_back() {
183 if (!elements_) return;
184
185 Iterator<Position &> e{end_, this};
186 e--;
187 --elements_;
188 }
189
190 private:
191 Container container_;
192 uint32_t elements_{0};
195};
196
197template <typename Type, uint32_t buffer_size>
199 : public CycleBuffer<buffer_size, std::array<Type, buffer_size>> {};
200
201} // namespace container
202} // namespace helper
203
204#endif // ROUTER_SRC_REST_MRS_SRC_HELPER_CONTAINER_CYCLIC_BUFFER_H_
Definition: cyclic_buffer.h:199
uint32_t flips_
Definition: cyclic_buffer.h:62
Const_position(const Const_position &p)
Definition: cyclic_buffer.h:58
Const_position(const Position &p)
Definition: cyclic_buffer.h:59
Cconst_interator it_
Definition: cyclic_buffer.h:61
Const_position()
Definition: cyclic_buffer.h:57
bool operator==(const Const_position &other) const
Definition: cyclic_buffer.h:64
Definition: cyclic_buffer.h:79
Iterator & operator++()
Definition: cyclic_buffer.h:90
Pos position_
Definition: cyclic_buffer.h:130
Iterator operator++(int)
Definition: cyclic_buffer.h:110
Buffer * buffer_
Definition: cyclic_buffer.h:131
Cpointer pointer
Definition: cyclic_buffer.h:84
bool operator==(const Iterator &other) const
Definition: cyclic_buffer.h:121
bool operator!=(Iterator other) const
Definition: cyclic_buffer.h:125
std::bidirectional_iterator_tag iterator_category
Definition: cyclic_buffer.h:81
Iterator operator--(int)
Definition: cyclic_buffer.h:115
Reference operator*() const
Definition: cyclic_buffer.h:127
long difference_type
Definition: cyclic_buffer.h:83
Iterator & operator--()
Definition: cyclic_buffer.h:99
Creference reference
Definition: cyclic_buffer.h:85
Iterator(Pos position, Buffer *buffer)
Definition: cyclic_buffer.h:87
CycleBuffer::value_type value_type
Definition: cyclic_buffer.h:82
Definition: cyclic_buffer.h:45
uint32_t flips_
Definition: cyclic_buffer.h:48
Cinterator it_
Definition: cyclic_buffer.h:47
bool operator==(const Position &other) const
Definition: cyclic_buffer.h:50
Definition: cyclic_buffer.h:36
value_type & back()
Definition: cyclic_buffer.h:172
typename Container::pointer Cpointer
Definition: cyclic_buffer.h:39
void try_resize(C &c)
Definition: cyclic_buffer.h:72
bool empty() const
Definition: cyclic_buffer.h:168
typename Container::const_reference Cconst_reference
Definition: cyclic_buffer.h:42
uint32_t elements_
Definition: cyclic_buffer.h:192
iterator begin()
Definition: cyclic_buffer.h:147
typename Container::value_type value_type
Definition: cyclic_buffer.h:43
const_iterator begin() const
Definition: cyclic_buffer.h:150
void pop_back()
Definition: cyclic_buffer.h:182
Iterator< Const_position, const CycleBuffer, Cconst_reference > const_iterator
Definition: cyclic_buffer.h:136
Container container_
Definition: cyclic_buffer.h:191
void push_back(V &&v)
Definition: cyclic_buffer.h:154
Iterator< Position > iterator
Definition: cyclic_buffer.h:134
typename Container::reference Creference
Definition: cyclic_buffer.h:41
const_iterator end() const
Definition: cyclic_buffer.h:151
Position end_
Definition: cyclic_buffer.h:194
void pop_front()
Definition: cyclic_buffer.h:174
value_type & front()
Definition: cyclic_buffer.h:170
typename Container::const_iterator Cconst_interator
Definition: cyclic_buffer.h:40
Container & container()
Definition: cyclic_buffer.h:145
iterator end()
Definition: cyclic_buffer.h:148
Position begin_
Definition: cyclic_buffer.h:193
void try_resize(std::array< value_type, buffer_size > &)
Definition: cyclic_buffer.h:69
CycleBuffer()
Definition: cyclic_buffer.h:139
uint32_t size() const
Definition: cyclic_buffer.h:166
typename Container::iterator Cinterator
Definition: cyclic_buffer.h:38
const char * p
Definition: ctype-mb.cc:1227
uint16_t value_type
Definition: vt100.h:184
Definition: atomics_array.h:39
Definition: cache.h:33
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