sparrow-ipc 0.2.0
Loading...
Searching...
No Matches
memory_output_stream.hpp
Go to the documentation of this file.
1
2#include <cstdint>
3#include <functional>
4#include <ranges>
5#include <span>
6
7namespace sparrow_ipc
8{
27 template <typename R>
28 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
30 {
31 public:
32
42 : m_buffer(&buffer) {};
43
55 memory_output_stream& write(const char* s, std::streamsize count);
56
65 memory_output_stream& write(std::span<const std::uint8_t> span);
66
77 memory_output_stream& write(uint8_t value, std::size_t count);
78
87 memory_output_stream& put(char value);
88
97 void reserve(std::size_t size);
98
106 void reserve(const std::function<std::size_t()>& calculate_reserve_size);
107
113 [[nodiscard]] size_t size() const;
114
115 private:
116
117 R* m_buffer;
118 };
119
120 // Implementation
121
122 template <typename R>
123 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
124 memory_output_stream<R>& memory_output_stream<R>::write(const char* s, std::streamsize count)
125 {
126 m_buffer->insert(m_buffer->end(), s, s + count);
127 return *this;
128 }
129
130 template <typename R>
131 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
132 memory_output_stream<R>& memory_output_stream<R>::write(std::span<const std::uint8_t> span)
133 {
134 m_buffer->insert(m_buffer->end(), span.begin(), span.end());
135 return *this;
136 }
137
138 template <typename R>
139 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
141 {
142 m_buffer->insert(m_buffer->end(), count, value);
143 return *this;
144 }
145
146 template <typename R>
147 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
149 {
150 m_buffer->push_back(static_cast<uint8_t>(value));
151 return *this;
152 }
153
154 template <typename R>
155 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
157 {
158 m_buffer->reserve(size);
159 }
160
161 template <typename R>
162 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
163 void memory_output_stream<R>::reserve(const std::function<std::size_t()>& calculate_reserve_size)
164 {
165 m_buffer->reserve(calculate_reserve_size());
166 }
167
168 template <typename R>
169 requires std::ranges::random_access_range<R> && std::same_as<typename R::value_type, uint8_t>
171 {
172 return m_buffer->size();
173 }
174}
An output stream that writes data to a contiguous memory buffer.
size_t size() const
Gets the current size of the buffer.
memory_output_stream & write(const char *s, std::streamsize count)
Writes character data to the buffer.
void reserve(std::size_t size)
Reserves capacity in the underlying buffer.
memory_output_stream & put(char value)
Writes a single character to the buffer.
memory_output_stream(R &buffer)
Constructs a memory output stream with a reference to a buffer.