Skip to content

Commit 1ea9a5a

Browse files
committed
Allow to reserve space for byte writer
1 parent 78b5026 commit 1ea9a5a

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

components/ocs_core/byte_writer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ size_t ByteWriter::write(const uint8_t* data, size_t size) {
3939
return ret;
4040
}
4141

42+
size_t ByteWriter::reserve(size_t size) {
43+
const size_t ret = std::min(size, left_());
44+
offset_ += ret;
45+
46+
return ret;
47+
}
48+
4249
size_t ByteWriter::left_() const {
4350
return size_ - offset_;
4451
}

components/ocs_core/byte_writer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ class ByteWriter : private core::NonCopyable<> {
3333
//! Write @p size bytes of @p data.
3434
size_t write(const uint8_t* data, size_t size);
3535

36+
//! Reserve space for @p size bytes.
37+
//!
38+
//! @return
39+
//! Number of reserved bytes.
40+
size_t reserve(size_t size);
41+
3642
//! Write any integer value.
3743
template <typename T> bool write(const T& t) {
3844
static_assert(std::is_integral<T>::value, "require integral type");

components/ocs_core/test/test_byte_writer.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,28 @@ TEST_CASE("Byte writer: write array: by parts", "[ocs_core], [byte_writer]") {
6767
TEST_ASSERT_TRUE(memcmp(want_buf, writer.get_data(), sizeof(want_buf)) == 0);
6868
}
6969

70+
TEST_CASE("Byte writer: reserve space: in range", "[ocs_core], [byte_writer]") {
71+
uint8_t write_buf[2];
72+
memset(write_buf, 7, sizeof(write_buf));
73+
74+
ByteWriter writer(write_buf, sizeof(write_buf));
75+
76+
TEST_ASSERT_EQUAL(1, writer.reserve(1));
77+
TEST_ASSERT_TRUE(writer.write(static_cast<uint8_t>(2)));
78+
TEST_ASSERT_FALSE(writer.write(static_cast<uint8_t>(2)));
79+
TEST_ASSERT_EQUAL(7, write_buf[0]);
80+
TEST_ASSERT_EQUAL(2, write_buf[1]);
81+
}
82+
83+
TEST_CASE("Byte writer: reserve space: no space left", "[ocs_core], [byte_writer]") {
84+
uint8_t write_buf[2];
85+
memset(write_buf, 7, sizeof(write_buf));
86+
87+
ByteWriter writer(write_buf, sizeof(write_buf));
88+
89+
TEST_ASSERT_EQUAL(writer.get_cap(), writer.reserve(writer.get_cap() + 1));
90+
TEST_ASSERT_EQUAL(0, writer.reserve(1));
91+
}
92+
7093
} // namespace core
7194
} // namespace ocs

0 commit comments

Comments
 (0)