MySQL 9.1.0
Source Code Documentation
rw_buffer.h
Go to the documentation of this file.
1/* Copyright (c) 2023, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24/// @file
25///
26/// Non-owning manager for a fixed memory buffer, which is split into
27/// a read part and a write part, with a movable split position.
28
29#ifndef MYSQL_CONTAINERS_BUFFERS_RW_BUFFER_H
30#define MYSQL_CONTAINERS_BUFFERS_RW_BUFFER_H
31
32#include <cassert>
33
35
36/// @addtogroup GroupLibsMysqlContainers
37/// @{
38
40
41/// Non-owning read/write memory buffer manager with a fixed size.
42///
43/// This has a read/write position (which @c Buffer_view does not
44/// have). It does not have functionailty to grow the buffer (as @c
45/// Managed_buffer has).
46///
47/// Objects have one internal contiguous buffer which is split into
48/// two parts, each of which is a Buffer_view: the first part is the
49/// read part and the second part is the write part. API clients may
50/// write to the write part and then move the position forwards: this
51/// will increase the read part so that API clients can read what was
52/// just written, and decrease the write part so that next write will
53/// happen after the position that was just written.
54///
55/// Generally, std::stringstream is a safer interface for buffers and
56/// should be preferred when possible. This class is intended for
57/// interaction with C-like APIs that request a (possibly
58/// uninitialized) memory buffer which they write to.
59template <class Char_tp = unsigned char>
60class Rw_buffer {
61 public:
62 using Char_t = Char_tp;
63 using Size_t = std::size_t;
64 using Difference_t = std::ptrdiff_t;
65 using Iterator_t = Char_t *;
66 using Const_iterator_t = const Char_t *;
68
69 Rw_buffer() = default;
70
71 /// Create a new Rw_buffer from the specified size and buffer.
72 ///
73 /// The read part will be 0 bytes at the beginning of the buffer,
74 /// and the write part will be the full buffer.
76 : m_read_part(buffer.begin(), 0),
78
79 /// Deleted copy constructor.
80 Rw_buffer(Rw_buffer &) = delete;
81
82 /// Default move constructor.
83 Rw_buffer(Rw_buffer &&) noexcept = default;
84
85 /// Deleted copy assignment operator.
86 Rw_buffer &operator=(Rw_buffer &) = delete;
87
88 /// Default move assignment operator.
89 Rw_buffer &operator=(Rw_buffer &&) noexcept = default;
90
91 /// Default delete operator.
92 virtual ~Rw_buffer() = default;
93
94 /// Return the read part.
95 const Buffer_view_t &read_part() const { return m_read_part; }
96
97 /// Return the read part.
99
100 /// Return the write part.
101 const Buffer_view_t &write_part() const { return m_write_part; }
102
103 /// Return the write part.
105
106 /// Return the total size of the read part and the write part.
107 Size_t capacity() const { return read_part().size() + write_part().size(); }
108
109 /// Set the position to a fixed number.
110 ///
111 /// The position is the same as the size of the read part.
112 ///
113 /// This adjusts the read part and the write part, so that the read
114 /// part size becomes equal to position, and the write part begins
115 /// where the read part ends.
116 ///
117 /// The specified position must be between 0 and capacity(),
118 /// inclusive.
119 ///
120 /// @note This alters the end iterator for the read part and the
121 /// begin iterator for the write part.
122 void set_position(Size_t new_position) {
123 auto capacity = this->capacity();
124 assert(new_position <= capacity);
125 new_position = std::min(new_position, capacity);
126
127 read_part() = Buffer_view_t(read_part().begin(), new_position);
128 write_part() = Buffer_view_t(read_part().end(), capacity - new_position);
129 }
130
131 /// Increase the position right, relative to the currrent position.
132 ///
133 /// The position is the same as the size of the read part.
134 ///
135 /// This adjusts the read part and the write part, so that the read
136 /// part size becomes equal to position, and the write part begins
137 /// where the read part ends.
138 ///
139 /// The resulting new position must be less than or equal to
140 /// capacity().
141 ///
142 /// @note This alters the end iterator for the read part and the
143 /// begin iterator for the write part.
144 void increase_position(Size_t increment) {
145 auto read_size = read_part().size();
146 assert(increment <= this->capacity() - read_size);
147 auto new_position = read_size + increment;
148 set_position(new_position);
149 }
150
151 /// Move the position left or right, relative to the current position.
152 ///
153 /// The position is the same as the size of the read part.
154 ///
155 /// This increments the right end of the read part by delta, and
156 /// increments the left end of the write part by delta.
157 ///
158 /// The resulting new position must be between 0 and capacity(),
159 /// inclusive.
160 ///
161 /// @note This alters the end iterator for the read part and the
162 /// begin iterator for the write part.
164 auto new_position = Difference_t(read_part().size()) + delta;
165 assert(new_position >= 0);
166 new_position = std::max(new_position, Difference_t(0));
167 set_position(Size_t(new_position));
168 }
169
170 protected:
173};
174
175} // namespace mysql::containers::buffers
176
177/// @}
178
179#endif // MYSQL_CONTAINERS_BUFFERS_RW_BUFFER_H
Class that groups a pointer+size as one object, without managing the memory for it.
Size_t size() const
Return the number of bytes.
Definition: buffer_view.h:112
Non-owning read/write memory buffer manager with a fixed size.
Definition: rw_buffer.h:60
mysql::containers::buffers::Buffer_view< Char_t > Buffer_view_t
Definition: rw_buffer.h:67
Buffer_view_t m_read_part
Definition: rw_buffer.h:171
Buffer_view_t & write_part()
Return the write part.
Definition: rw_buffer.h:104
Rw_buffer(Rw_buffer &)=delete
Deleted copy constructor.
Char_tp Char_t
Definition: rw_buffer.h:62
void increase_position(Size_t increment)
Increase the position right, relative to the currrent position.
Definition: rw_buffer.h:144
Rw_buffer(Rw_buffer &&) noexcept=default
Default move constructor.
Buffer_view_t m_write_part
Definition: rw_buffer.h:172
Size_t capacity() const
Return the total size of the read part and the write part.
Definition: rw_buffer.h:107
const Buffer_view_t & read_part() const
Return the read part.
Definition: rw_buffer.h:95
Char_t * Iterator_t
Definition: rw_buffer.h:65
const Buffer_view_t & write_part() const
Return the write part.
Definition: rw_buffer.h:101
void move_position(Difference_t delta)
Move the position left or right, relative to the current position.
Definition: rw_buffer.h:163
const Char_t * Const_iterator_t
Definition: rw_buffer.h:66
Buffer_view_t & read_part()
Return the read part.
Definition: rw_buffer.h:98
std::size_t Size_t
Definition: rw_buffer.h:63
std::ptrdiff_t Difference_t
Definition: rw_buffer.h:64
Rw_buffer(Buffer_view_t buffer)
Create a new Rw_buffer from the specified size and buffer.
Definition: rw_buffer.h:75
void set_position(Size_t new_position)
Set the position to a fixed number.
Definition: rw_buffer.h:122
Definition: buffer_sequence_view.h:51
const char * begin(const char *const c)
Definition: base64.h:44
size_t size(const char *const c)
Definition: base64.h:46
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418