StormByte C++ Library: Buffer module 1.2.0
StormByte-Buffer is the buffer module of the StormByte C++ suite.
Loading...
Searching...
No Matches
external.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte-Buffer.
5 *
6 * StormByte-Buffer is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License version 3
8 * or later, as published by the Free Software Foundation.
9 *
10 * StormByte-Buffer is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with StormByte-Buffer. If not, see
17 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
18 */
19
20#pragma once
21
24#include <StormByte/clonable.hxx>
25
26#include <functional>
27#include <string_view>
28
33namespace StormByte::Buffer {
55 : public Clonable<ExternalReader, std::unique_ptr<ExternalReader>> {
56 public:
61 ExternalReader() noexcept = default;
62 ExternalReader(const ExternalReader&) = default;
63 ExternalReader(ExternalReader&&) noexcept = default;
64 ~ExternalReader() noexcept override;
65
66 ExternalReader& operator=(const ExternalReader&) = default;
67 ExternalReader& operator=(ExternalReader&&) noexcept = default;
79 virtual std::size_t AvailableBytes() const noexcept = 0;
80
85 virtual bool Empty() const noexcept = 0;
86
92 virtual bool EoF() const noexcept = 0;
93
98 virtual bool IsReadable() const noexcept = 0;
99
113 virtual bool Read(std::size_t count, DataType& out) const noexcept = 0;
114
120 inline bool Read(DataType& out) const noexcept {
121 return Read(0, out);
122 }
123
130 virtual bool Extract(std::size_t count, DataType& out) noexcept = 0;
131
137 inline bool Extract(DataType& out) noexcept {
138 return Extract(0, out);
139 }
140
147 virtual bool Peek(std::size_t count, DataType& out) const noexcept = 0;
148
153 virtual void ReadUntilEoF(DataType& out) const noexcept = 0;
154
159 virtual void ExtractUntilEoF(DataType& out) noexcept = 0;
160
175 virtual void Seek(std::ptrdiff_t offset, Position mode) const noexcept;
176
182 virtual void Clean() noexcept;
183
185 };
186
197 public:
207 explicit ExternalBufferReader(ReadOnly& buffer) noexcept
208 : m_buffer(buffer) {}
209
212 ~ExternalBufferReader() noexcept override;
213
214 ExternalBufferReader& operator=(const ExternalBufferReader&) = default;
215 ExternalBufferReader& operator=(ExternalBufferReader&&) noexcept = default;
216
228 PointerType Clone() const noexcept override;
229
234 PointerType Move() noexcept override;
235
242 std::size_t AvailableBytes() const noexcept override;
243 bool Empty() const noexcept override;
244 bool EoF() const noexcept override;
245 bool IsReadable() const noexcept override;
252 bool Read(std::size_t count, DataType& out) const noexcept override;
253 bool Extract(std::size_t count, DataType& out) noexcept override;
254 bool Peek(std::size_t count, DataType& out) const noexcept override;
255
256 void ReadUntilEoF(DataType& out) const noexcept override;
257 void ExtractUntilEoF(DataType& out) noexcept override;
264 void Seek(std::ptrdiff_t offset, Position mode) const noexcept override;
265 void Clean() noexcept override;
268 private:
269 std::reference_wrapper<ReadOnly> m_buffer;
270 };
271
284 : public Clonable<ExternalWriter, std::unique_ptr<ExternalWriter>> {
285 public:
290 ExternalWriter() noexcept = default;
292 ExternalWriter(ExternalWriter&&) noexcept = default;
293 ~ExternalWriter() noexcept override;
294
295 ExternalWriter& operator=(const ExternalWriter&) = default;
296 ExternalWriter& operator=(ExternalWriter&&) noexcept = default;
308 virtual bool IsWritable() const noexcept = 0;
309
322 virtual bool Write(const DataType& data) noexcept = 0;
323
329 virtual bool Write(DataType&& data) noexcept = 0;
330
337 virtual bool Write(std::size_t count, const DataType& data) noexcept = 0;
338
345 virtual bool Write(std::size_t count, DataType&& data) noexcept = 0;
346
363 bool Write(std::string_view sv) noexcept;
364
370 bool Write(const char* s) noexcept;
371
378 bool Write(std::size_t count, std::string_view sv) noexcept;
379
386 template<std::size_t N>
387 bool Write(const char (&s)[N]) noexcept {
388 if (N == 0) return Write(DataType{});
389 return Write(std::string_view(s, N > 0 ? N - 1 : 0));
390 }
391
404 virtual void Close() noexcept = 0;
405
411 virtual void SetError() noexcept = 0;
412
414 };
415
429 public:
439 explicit ExternalBufferWriter(WriteOnly& buffer) noexcept
440 : m_buffer(buffer) {}
441
444 ~ExternalBufferWriter() noexcept override;
445
446 ExternalBufferWriter& operator=(const ExternalBufferWriter&) = default;
447 ExternalBufferWriter& operator=(ExternalBufferWriter&&) noexcept = default;
448
460 PointerType Clone() const noexcept override;
461
466 PointerType Move() noexcept override;
467
475 bool IsWritable() const noexcept override;
476
477 bool Write(const DataType& data) noexcept override;
478 bool Write(DataType&& data) noexcept override;
479 bool Write(std::size_t count, const DataType& data) noexcept override;
480 bool Write(std::size_t count, DataType&& data) noexcept override;
481
482 void Close() noexcept override;
483 void SetError() noexcept override;
486 private:
487 std::reference_wrapper<WriteOnly> m_buffer;
488 };
489}
Adapter that turns any ReadOnly buffer into an ExternalReader.
Definition external.hxx:196
ExternalBufferReader(const ExternalBufferReader &)=default
ExternalBufferReader(ReadOnly &buffer) noexcept
Construct from a ReadOnly reference.
Definition external.hxx:207
ExternalBufferReader(ExternalBufferReader &&) noexcept=default
Adapter that turns any WriteOnly buffer into an ExternalWriter.
Definition external.hxx:428
ExternalBufferWriter(ExternalBufferWriter &&) noexcept=default
ExternalBufferWriter(WriteOnly &buffer) noexcept
Construct from a WriteOnly reference.
Definition external.hxx:439
ExternalBufferWriter(const ExternalBufferWriter &)=default
Abstract interface for reading data from an external or internal source.
Definition external.hxx:55
bool Extract(DataType &out) noexcept
Convenience overload — extract all available bytes.
Definition external.hxx:137
ExternalReader() noexcept=default
virtual void Clean() noexcept
Discard already-consumed data (from start up to the current read position).
virtual void ReadUntilEoF(DataType &out) const noexcept=0
Read everything until EoF (non-destructive).
virtual bool Peek(std::size_t count, DataType &out) const noexcept=0
Non-destructive peek (does not advance the position).
virtual void Seek(std::ptrdiff_t offset, Position mode) const noexcept
Move the logical read position.
virtual bool Extract(std::size_t count, DataType &out) noexcept=0
Destructive read (consumes / erases data from the source).
virtual void ExtractUntilEoF(DataType &out) noexcept=0
Extract everything until EoF (destructive).
Abstract interface for writing data to an external or internal sink.
Definition external.hxx:284
virtual void Close() noexcept=0
Mark the sink closed for further writes.
ExternalWriter() noexcept=default
Pure interface for a buffer that can be read but not written.
Definition generic.hxx:164
Pure interface for a buffer that can be written but not read.
Definition generic.hxx:420
Buffer module of the StormByte suite.
std::vector< std::byte > DataType
Primary byte storage type used throughout the buffer API.
Definition typedefs.hxx:62
Position
Forward declaration of the WriteOnly interface.
Definition typedefs.hxx:50
#define STORMBYTE_BUFFER_PUBLIC
Definition visibility.h:28