diff --git a/include/tscpp/util/LocalBuffer.h b/include/tscpp/util/LocalBuffer.h index aaaac0a2ade..3c3e186e518 100644 --- a/include/tscpp/util/LocalBuffer.h +++ b/include/tscpp/util/LocalBuffer.h @@ -42,6 +42,11 @@ template class LocalBuffer T *data() const; std::size_t size() const; + T &operator[](std::size_t index); + const T &operator[](std::size_t index) const; + + operator T *(); + private: T _buf[EstSizeBound]; T *const _ptr; @@ -69,4 +74,19 @@ LocalBuffer::size() const return _size; } +template inline T &LocalBuffer::operator[](std::size_t index) +{ + return data()[index]; +} + +template inline const T &LocalBuffer::operator[](std::size_t index) const +{ + return data()[index]; +} + +template inline LocalBuffer::operator T *() +{ + return data(); +} + } // namespace ts diff --git a/src/tscpp/util/unit_tests/test_LocalBuffer.cc b/src/tscpp/util/unit_tests/test_LocalBuffer.cc index 9d4b3a3bbd0..a37f6d36ded 100644 --- a/src/tscpp/util/unit_tests/test_LocalBuffer.cc +++ b/src/tscpp/util/unit_tests/test_LocalBuffer.cc @@ -108,4 +108,24 @@ TEST_CASE("LocalBuffer", "[libts][LocalBuffer]") CHECK(local_buffer.size() == 4096); } } + + SECTION("Transparent access") + { + const size_t len = 1024; + ts::LocalBuffer local_buffer1(len); + ts::LocalBuffer local_buffer2(len); + + memset(local_buffer1, 0xAA, len); + local_buffer1[len - 1] = 0xBB; + + CHECK(local_buffer1[0] == 0xAA); + CHECK(local_buffer1[len - 1] == 0xBB); + CHECK(local_buffer1.size() == 1024); + + memcpy(local_buffer2, local_buffer1, local_buffer2.size()); + + CHECK(local_buffer2[0] == 0xAA); + CHECK(local_buffer2[len - 1] == 0xBB); + CHECK(local_buffer2.size() == 1024); + } }