diff --git a/include/fastcdr/FastBuffer.h b/include/fastcdr/FastBuffer.h index 8c9484ab..5ede4780 100644 --- a/include/fastcdr/FastBuffer.h +++ b/include/fastcdr/FastBuffer.h @@ -245,6 +245,13 @@ namespace eprosima return (iterator(m_buffer, m_bufferSize)); } + /*! + * @brief This function reserves memory for the internal raw buffer. It will only do so if the buffer is not yet allocated and is not externally set. + * @param size The size of the memory to be allocated. + * @return True if the allocation suceeded. False if the raw buffer was set externally or is already allocated. + */ + bool reserve(size_t size); + /*! * @brief This function resizes the raw buffer. It will call the user's defined function for this purpose. * @param minSizeInc The minimun growth expected of the current raw buffer. diff --git a/src/cpp/FastBuffer.cpp b/src/cpp/FastBuffer.cpp index 24dec1ed..8af01b7c 100644 --- a/src/cpp/FastBuffer.cpp +++ b/src/cpp/FastBuffer.cpp @@ -42,6 +42,19 @@ FastBuffer::~FastBuffer() } } +bool FastBuffer::reserve(size_t size) +{ + if (m_internalBuffer && m_buffer == NULL) + { + m_buffer = (char *)malloc(size); + if (m_buffer) { + m_bufferSize = size; + return true; + } + } + return false; +} + bool FastBuffer::resize(size_t minSizeInc) { size_t incBufferSize = BUFFER_START_LENGTH; diff --git a/test/ResizeTest.cpp b/test/ResizeTest.cpp index b5384b82..9e3f2f28 100644 --- a/test/ResizeTest.cpp +++ b/test/ResizeTest.cpp @@ -3820,3 +3820,21 @@ TEST(FastCDRResizeTests, Complete) free(ldouble_seq_value); free(c_string_value); } + +TEST(CDRResizeTests, ReserveBuffer) +{ + FastBuffer buffer0; + EXPECT_EQ(true, buffer0.reserve(100)); + EXPECT_EQ(100, buffer0.getBufferSize()); + + FastBuffer buffer1; + EXPECT_EQ(true, buffer1.resize(100)); + EXPECT_EQ(200, buffer1.getBufferSize()); + EXPECT_EQ(false, buffer1.reserve(300)); + EXPECT_EQ(200, buffer1.getBufferSize()); + + char raw_buffer[10]; + FastBuffer buffer2(&raw_buffer[0], 10); + EXPECT_EQ(false, buffer2.reserve(100)); + EXPECT_EQ(10, buffer2.getBufferSize()); +}