From 30ee75c0cf1f62f5379f372d6e3f86f26d76ecb7 Mon Sep 17 00:00:00 2001 From: Dmitriy Shilin Date: Wed, 28 Jan 2026 15:24:00 +0100 Subject: [PATCH] Allow to reserve space for byte writer --- components/ocs_core/byte_writer.cpp | 7 ++++++ components/ocs_core/byte_writer.h | 6 +++++ components/ocs_core/test/test_byte_writer.cpp | 23 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/components/ocs_core/byte_writer.cpp b/components/ocs_core/byte_writer.cpp index e731d912..0532ca43 100644 --- a/components/ocs_core/byte_writer.cpp +++ b/components/ocs_core/byte_writer.cpp @@ -39,6 +39,13 @@ size_t ByteWriter::write(const uint8_t* data, size_t size) { return ret; } +size_t ByteWriter::reserve(size_t size) { + const size_t ret = std::min(size, left_()); + offset_ += ret; + + return ret; +} + size_t ByteWriter::left_() const { return size_ - offset_; } diff --git a/components/ocs_core/byte_writer.h b/components/ocs_core/byte_writer.h index b39451e4..d49abf5a 100644 --- a/components/ocs_core/byte_writer.h +++ b/components/ocs_core/byte_writer.h @@ -33,6 +33,12 @@ class ByteWriter : private core::NonCopyable<> { //! Write @p size bytes of @p data. size_t write(const uint8_t* data, size_t size); + //! Reserve space for @p size bytes. + //! + //! @return + //! Number of reserved bytes. + size_t reserve(size_t size); + //! Write any integer value. template bool write(const T& t) { static_assert(std::is_integral::value, "require integral type"); diff --git a/components/ocs_core/test/test_byte_writer.cpp b/components/ocs_core/test/test_byte_writer.cpp index 465c744c..9d81d6da 100644 --- a/components/ocs_core/test/test_byte_writer.cpp +++ b/components/ocs_core/test/test_byte_writer.cpp @@ -67,5 +67,28 @@ TEST_CASE("Byte writer: write array: by parts", "[ocs_core], [byte_writer]") { TEST_ASSERT_TRUE(memcmp(want_buf, writer.get_data(), sizeof(want_buf)) == 0); } +TEST_CASE("Byte writer: reserve space: in range", "[ocs_core], [byte_writer]") { + uint8_t write_buf[2]; + memset(write_buf, 7, sizeof(write_buf)); + + ByteWriter writer(write_buf, sizeof(write_buf)); + + TEST_ASSERT_EQUAL(1, writer.reserve(1)); + TEST_ASSERT_TRUE(writer.write(static_cast(2))); + TEST_ASSERT_FALSE(writer.write(static_cast(2))); + TEST_ASSERT_EQUAL(7, write_buf[0]); + TEST_ASSERT_EQUAL(2, write_buf[1]); +} + +TEST_CASE("Byte writer: reserve space: no space left", "[ocs_core], [byte_writer]") { + uint8_t write_buf[2]; + memset(write_buf, 7, sizeof(write_buf)); + + ByteWriter writer(write_buf, sizeof(write_buf)); + + TEST_ASSERT_EQUAL(writer.get_cap(), writer.reserve(writer.get_cap() + 1)); + TEST_ASSERT_EQUAL(0, writer.reserve(1)); +} + } // namespace core } // namespace ocs