Sen API
Sen Libraries
Loading...
Searching...
No Matches
buffer_writer.h
Go to the documentation of this file.
1// === buffer_writer.h =================================================================================================
2// Sen Infrastructure
3// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4// See the LICENSE.txt file for more information.
5// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6// =====================================================================================================================
7
8#ifndef SEN_CORE_IO_BUFFER_WRITER_H
9#define SEN_CORE_IO_BUFFER_WRITER_H
10
12#include "sen/core/base/span.h"
13
14#include <vector>
15
16namespace sen
17{
18
20class Writer
21{
22 SEN_NOCOPY_NOMOVE(Writer)
23
24public:
25 Writer() noexcept = default;
26 virtual ~Writer() noexcept = default;
27
28public:
30 virtual uint8_t* advance(size_t size) = 0;
31
33 virtual void reverse(size_t size) = 0;
34};
35
37class BufferWriter final: public Writer
38{
39 SEN_NOCOPY_NOMOVE(BufferWriter)
40
41public:
42 explicit BufferWriter(Span<uint8_t> buffer) noexcept: cursor_(buffer.data()) {}
43 ~BufferWriter() override = default;
44
45public: // implements sen::Writer
46 [[nodiscard]] uint8_t* advance(size_t size) override;
47 void reverse(size_t size) override
48 {
49 cursor_ -= size; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
50 }
51
52private:
53 uint8_t* cursor_;
54};
55
57template <typename Container = std::vector<uint8_t>>
58class ResizableBufferWriter final: public Writer
59{
60 SEN_NOCOPY_NOMOVE(ResizableBufferWriter)
61
62public:
63 explicit ResizableBufferWriter(Container& buffer) noexcept: buffer_(buffer) {}
64 ~ResizableBufferWriter() override = default;
65
66public: // implements sen::Writer
67 [[nodiscard]] uint8_t* advance(size_t size) override;
68 void reverse(size_t size) override
69 {
70 SEN_ASSERT(buffer_.size() >= size);
71 buffer_.resize(buffer_.size() - size);
72 }
73
74private:
75 Container& buffer_;
76};
77
78//----------------------------------------------------------------------------------------------------------------------
79// Inline implementation
80//----------------------------------------------------------------------------------------------------------------------
81
82//--------------------------------------------------------------------------------------------------------------
83// BufferWriter
84//--------------------------------------------------------------------------------------------------------------
85
86inline uint8_t* BufferWriter::advance(size_t size)
87{
88 auto* oldCursor = cursor_;
89 cursor_ += size; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
90 return oldCursor;
91}
92
93//--------------------------------------------------------------------------------------------------------------
94// ResizableBufferWriter
95//--------------------------------------------------------------------------------------------------------------
96
97template <typename Container>
99{
100 const auto cursor = buffer_.size();
101 buffer_.resize(buffer_.size() + size);
102 return buffer_.data() + cursor; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
103}
104
105} // namespace sen
106
107#endif // SEN_CORE_IO_BUFFER_WRITER_H
The following macros implement a replacement of assert that is connected to the overall fault handlin...
~BufferWriter() override=default
BufferWriter(Span< uint8_t > buffer) noexcept
Definition buffer_writer.h:42
void reverse(size_t size) override
Moves the cursor 'size' bytes.
Definition buffer_writer.h:47
uint8_t * advance(size_t size) override
Returns a buffer of 'size' bytes, owned by the writer.
Definition buffer_writer.h:86
~ResizableBufferWriter() override=default
ResizableBufferWriter(Container &buffer) noexcept
Definition buffer_writer.h:63
void reverse(size_t size) override
Moves the cursor 'size' bytes.
Definition buffer_writer.h:68
uint8_t * advance(size_t size) override
Returns a buffer of 'size' bytes, owned by the writer.
Definition buffer_writer.h:98
Contiguous view of elements of type T. Inspired by http://www.open-std.org/jtc1/sc22/wg21/docs/papers...
Definition span.h:34
virtual uint8_t * advance(size_t size)=0
Returns a buffer of 'size' bytes, owned by the writer.
virtual void reverse(size_t size)=0
Moves the cursor 'size' bytes.
Writer() noexcept=default
#define SEN_ASSERT(expr)
Checks an intermediate result produced by a procedure (not an input or output). NOLINTNEXTLINE.
Definition assert.h:39
Definition assert.h:17