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
11#include "sen/core/base/span.h"
12
13#include <vector>
14
15namespace sen
16{
17
19class Writer
20{
21 SEN_NOCOPY_NOMOVE(Writer)
22
23public:
24 Writer() noexcept = default;
25 virtual ~Writer() noexcept = default;
26
27public:
29 virtual uint8_t* advance(size_t size) = 0;
30
32 virtual void reverse(size_t size) = 0;
33};
34
36class BufferWriter final: public Writer
37{
38 SEN_NOCOPY_NOMOVE(BufferWriter)
39
40public:
41 explicit BufferWriter(Span<uint8_t> buffer) noexcept: cursor_(buffer.data()) {}
42 ~BufferWriter() override = default;
43
44public: // implements sen::Writer
45 [[nodiscard]] uint8_t* advance(size_t size) override;
46 void reverse(size_t size) override
47 {
48 cursor_ -= size; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
49 }
50
51private:
52 uint8_t* cursor_;
53};
54
56template <typename Container = std::vector<uint8_t>>
57class ResizableBufferWriter final: public Writer
58{
59 SEN_NOCOPY_NOMOVE(ResizableBufferWriter)
60
61public:
62 explicit ResizableBufferWriter(Container& buffer) noexcept: buffer_(buffer) {}
63 ~ResizableBufferWriter() override = default;
64
65public: // implements sen::Writer
66 [[nodiscard]] uint8_t* advance(size_t size) override;
67 void reverse(size_t size) override { buffer_.resize(buffer_.size() - size); }
68
69private:
70 Container& buffer_;
71};
72
73//----------------------------------------------------------------------------------------------------------------------
74// Inline implementation
75//----------------------------------------------------------------------------------------------------------------------
76
77//--------------------------------------------------------------------------------------------------------------
78// BufferWriter
79//--------------------------------------------------------------------------------------------------------------
80
81inline uint8_t* BufferWriter::advance(size_t size)
82{
83 auto* oldCursor = cursor_;
84 cursor_ += size; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
85 return oldCursor;
86}
87
88//--------------------------------------------------------------------------------------------------------------
89// ResizableBufferWriter
90//--------------------------------------------------------------------------------------------------------------
91
92template <typename Container>
94{
95 const auto cursor = buffer_.size();
96 buffer_.resize(buffer_.size() + size);
97 return buffer_.data() + cursor; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
98}
99
100} // namespace sen
101
102#endif // SEN_CORE_IO_BUFFER_WRITER_H
~BufferWriter() override=default
BufferWriter(Span< uint8_t > buffer) noexcept
Definition buffer_writer.h:41
void reverse(size_t size) override
Moves the cursor 'size' bytes.
Definition buffer_writer.h:46
uint8_t * advance(size_t size) override
Returns a buffer of 'size' bytes, owned by the writer.
Definition buffer_writer.h:81
~ResizableBufferWriter() override=default
ResizableBufferWriter(Container &buffer) noexcept
Definition buffer_writer.h:62
void reverse(size_t size) override
Moves the cursor 'size' bytes.
Definition buffer_writer.h:67
uint8_t * advance(size_t size) override
Returns a buffer of 'size' bytes, owned by the writer.
Definition buffer_writer.h:93
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
Definition assert.h:17