Sen API
Sen Libraries
Loading...
Searching...
No Matches
reader_writer.h
Go to the documentation of this file.
1// === reader_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_LIBS_CORE_TEST_SUPPORT_READER_WRITER_H
9#define SEN_LIBS_CORE_TEST_SUPPORT_READER_WRITER_H
10
11#include "sen/core/base/span.h"
13
14// std
15#include <cstring>
16#include <vector>
17
18namespace sen::test
19{
20
21class TestWriter: public Writer
22{
23 SEN_NOCOPY_NOMOVE(TestWriter)
24
25public:
26 inline TestWriter() noexcept = default;
27 ~TestWriter() noexcept override = default;
28
29public:
30 Span<uint8_t> loanBuffer(size_t size)
31 {
32 buffer_.resize(buffer_.size() + size);
33 return makeSpan(&buffer_[cursor_], size);
34 }
35
37 {
38 writeCount_++;
39 cursor_ += buffer.size();
40 }
41
42 std::vector<uint8_t>& getBuffer() noexcept { return buffer_; }
43
44 [[nodiscard]] std::size_t getWriteCount() const noexcept { return writeCount_; }
45
46 uint8_t* advance(size_t size) override
47 {
48 const auto cursor = buffer_.size();
49 buffer_.resize(buffer_.size() + size);
50 return std::next(buffer_.data(), static_cast<int>(cursor));
51 };
52
53 void reverse(size_t size) override { buffer_.resize(buffer_.size() - size); };
54
55private:
56 std::vector<uint8_t> buffer_;
57 std::size_t cursor_ = 0U;
58 std::size_t writeCount_ = 0U;
59};
60
61class TestReader //: public Reader
62{
63 SEN_NOCOPY_NOMOVE(TestReader)
64
65public:
66 inline explicit TestReader(const std::vector<uint8_t>& buffer) noexcept: buffer_(buffer) {}
67
68 virtual ~TestReader() noexcept = default;
69
70public:
71 Span<const uint8_t> read(size_t size)
72 {
73 readCount_++;
74
75 auto nextCursor = cursor_ + size;
76 if (nextCursor > buffer_.size())
77 {
78 sen::throwRuntimeError("input buffer underflow");
79 }
80
81 auto ptr = &buffer_[cursor_];
82 cursor_ = nextCursor;
83 return makeConstSpan(ptr, size);
84 }
85
86 const std::vector<uint8_t>& getBuffer() noexcept { return buffer_; }
87
88 [[nodiscard]] std::size_t getReadCount() const noexcept { return readCount_; }
89
90private:
91 const std::vector<uint8_t>& buffer_;
92 std::size_t cursor_ = 0U;
93 std::size_t readCount_ = 0U;
94};
95
97{
98 SEN_NOCOPY_NOMOVE(BufferedTestReader);
99
100public:
101 inline explicit BufferedTestReader() noexcept: TestReader(buffer_) {}
102
103 ~BufferedTestReader() noexcept override = default;
104
105 std::vector<uint8_t>& getBuffer() noexcept { return buffer_; }
106
107 [[nodiscard]] const std::vector<uint8_t>& getBuffer() const noexcept { return buffer_; }
108
109private:
110 std::vector<uint8_t> buffer_;
111};
112
113template <typename T>
114std::vector<uint8_t> valueToBytes(const T data)
115{
116 std::vector<uint8_t> result;
117
118 if constexpr (std::is_same_v<T, std::string>)
119 {
120 if (!data.empty())
121 { // otherwise, we try to memcpy a nullptr
122 result.resize(data.size());
123 std::memcpy(result.data(), data.data(), data.size());
124 }
125 }
126 else
127 {
128 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
129 const auto* dataPtr = reinterpret_cast<const uint8_t*>(&data); // NOSONAR
130 for (std::size_t i = 0U; i < sizeof(T); ++i)
131 {
132 result.push_back(*(std::next(dataPtr, static_cast<int>(i))));
133 }
134 }
135
136 return result;
137}
138
139} // namespace sen::test
140
141#endif // SEN_LIBS_CORE_TEST_SUPPORT_READER_WRITER_H
Contiguous view of elements of type T. Inspired by http://www.open-std.org/jtc1/sc22/wg21/docs/papers...
Definition span.h:34
constexpr std::size_t size() const noexcept
Number of elements covered by the Span.
Definition span.h:133
Writer() noexcept=default
BufferedTestReader() noexcept
Definition reader_writer.h:101
~BufferedTestReader() noexcept override=default
const std::vector< uint8_t > & getBuffer() const noexcept
Definition reader_writer.h:107
std::vector< uint8_t > & getBuffer() noexcept
Definition reader_writer.h:105
Span< const uint8_t > read(size_t size)
Definition reader_writer.h:71
std::size_t getReadCount() const noexcept
Definition reader_writer.h:88
TestReader(const std::vector< uint8_t > &buffer) noexcept
Definition reader_writer.h:66
const std::vector< uint8_t > & getBuffer() noexcept
Definition reader_writer.h:86
virtual ~TestReader() noexcept=default
Span< uint8_t > loanBuffer(size_t size)
Definition reader_writer.h:30
uint8_t * advance(size_t size) override
Returns a buffer of 'size' bytes, owned by the writer.
Definition reader_writer.h:46
TestWriter() noexcept=default
std::vector< uint8_t > & getBuffer() noexcept
Definition reader_writer.h:42
std::size_t getWriteCount() const noexcept
Definition reader_writer.h:44
void returnBuffer(Span< uint8_t > buffer)
Definition reader_writer.h:36
void reverse(size_t size) override
Moves the cursor 'size' bytes.
Definition reader_writer.h:53
constexpr Span< T > makeSpan(T *ptr, std::size_t size) noexcept
Takes in a type that can be passed to a contiguous range and returns a Span.
Definition span.h:201
constexpr Span< const T > makeConstSpan(const T *ptr, std::size_t size) noexcept
Takes in a type that can be passed to a contiguous range and returns a Span. The element types will b...
Definition span.h:248
Definition reader_writer.h:19
std::vector< uint8_t > valueToBytes(const T data)
Definition reader_writer.h:114
STL namespace.