sparrow-ipc 0.2.0
Loading...
Searching...
No Matches
chunk_memory_output_stream.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <functional>
5#include <numeric>
6#include <ranges>
7#include <vector>
8
9namespace sparrow_ipc
10{
28 template <typename R>
29 requires std::ranges::random_access_range<R>
30 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
31 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
33 {
34 public:
35
42 explicit chunked_memory_output_stream(R& chunks)
43 : m_chunks(&chunks) {};
44
54 chunked_memory_output_stream<R>& write(const char* s, std::streamsize count);
55
64 chunked_memory_output_stream<R>& write(std::span<const std::uint8_t> span);
65
75 chunked_memory_output_stream<R>& write(std::vector<uint8_t>&& buffer);
76
86 chunked_memory_output_stream<R>& write(uint8_t value, std::size_t count);
87
97
106 void reserve(std::size_t size);
107
115 void reserve(const std::function<std::size_t()>& calculate_reserve_size);
116
124 [[nodiscard]] size_t size() const;
125
126 private:
127
128 R* m_chunks;
129 };
130
131 // Implementation
132
133 template <typename R>
134 requires std::ranges::random_access_range<R>
135 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
136 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
138 {
139 m_chunks->emplace_back(s, s + count);
140 return *this;
141 }
142
143 template <typename R>
144 requires std::ranges::random_access_range<R>
145 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
146 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
148 {
149 m_chunks->emplace_back(span.begin(), span.end());
150 return *this;
151 }
152
153 template <typename R>
154 requires std::ranges::random_access_range<R>
155 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
156 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
158 {
159 m_chunks->emplace_back(std::move(buffer));
160 return *this;
161 }
162
163 template <typename R>
164 requires std::ranges::random_access_range<R>
165 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
166 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
168 {
169 m_chunks->emplace_back(count, value);
170 return *this;
171 }
172
173 template <typename R>
174 requires std::ranges::random_access_range<R>
175 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
176 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
178 {
179 m_chunks->emplace_back(std::vector<uint8_t>{static_cast<uint8_t>(value)});
180 return *this;
181 }
182
183 template <typename R>
184 requires std::ranges::random_access_range<R>
185 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
186 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
188 {
189 m_chunks->reserve(size);
190 }
191
192 template <typename R>
193 requires std::ranges::random_access_range<R>
194 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
195 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
196 void chunked_memory_output_stream<R>::reserve(const std::function<std::size_t()>& calculate_reserve_size)
197 {
198 m_chunks->reserve(calculate_reserve_size());
199 }
200
201 template <typename R>
202 requires std::ranges::random_access_range<R>
203 && std::ranges::random_access_range<std::ranges::range_value_t<R>>
204 && std::same_as<typename std::ranges::range_value_t<R>::value_type, uint8_t>
206 {
207 return std::accumulate(
208 m_chunks->begin(),
209 m_chunks->end(),
210 0,
211 [](size_t acc, const auto& chunk)
212 {
213 return acc + chunk.size();
214 }
215 );
216 }
217}
chunked_memory_output_stream< R > & put(char value)
Writes a single character as a new chunk.
chunked_memory_output_stream< R > & write(const char *s, std::streamsize count)
Writes character data as a new chunk.
chunked_memory_output_stream< R > & write(std::span< const std::uint8_t > span)
Writes a span of bytes as a new chunk.
void reserve(const std::function< std::size_t()> &calculate_reserve_size)
Reserves capacity using a lazy calculation function.
chunked_memory_output_stream(R &chunks)
Constructs a chunked memory output stream with a reference to a chunk container.
void reserve(std::size_t size)
Reserves capacity in the chunk container.
chunked_memory_output_stream< R > & write(uint8_t value, std::size_t count)
Writes a byte value repeated a specified number of times as a new chunk.
chunked_memory_output_stream< R > & write(std::vector< uint8_t > &&buffer)
Writes a buffer by moving it into the chunk container.