diff --git a/include/ArduinoJson/DynamicJsonBuffer.hpp b/include/ArduinoJson/DynamicJsonBuffer.hpp index 81d195be..16b7626c 100644 --- a/include/ArduinoJson/DynamicJsonBuffer.hpp +++ b/include/ArduinoJson/DynamicJsonBuffer.hpp @@ -15,11 +15,13 @@ namespace ArduinoJson { // more suitable for embedded systems. class DynamicJsonBuffer : public JsonBuffer { public: - explicit DynamicJsonBuffer() : _next(NULL), _size(0) {} + DynamicJsonBuffer() : _next(NULL), _size(0) {} - size_t size() const { return _size; } + ~DynamicJsonBuffer() { delete _next; } - size_t blockCount() const { return _next ? _next->blockCount() + 1 : 1; } + size_t size() const { return _size + (_next ? _next->size() : 0); } + + size_t blockCount() const { return 1 + (_next ? _next->blockCount() : 0); } static const size_t BLOCK_CAPACITY = 32; @@ -43,10 +45,11 @@ class DynamicJsonBuffer : public JsonBuffer { _size += bytes; return p; } + bool canAllocInOtherBlocks(size_t bytes) const { // by design a DynamicJsonBuffer can't alloc a block bigger than // BLOCK_CAPACITY - return bytes < BLOCK_CAPACITY; + return bytes <= BLOCK_CAPACITY; } void* allocInOtherBlocks(size_t bytes) { diff --git a/test/DynamicJsonBuffer_Basic_Tests.cpp b/test/DynamicJsonBuffer_Basic_Tests.cpp index 83c949a9..e23a4001 100644 --- a/test/DynamicJsonBuffer_Basic_Tests.cpp +++ b/test/DynamicJsonBuffer_Basic_Tests.cpp @@ -29,6 +29,8 @@ TEST_F(DynamicJsonBuffer_Basic_Tests, SizeIncreasesAfterAlloc) { ASSERT_EQ(1, buffer.size()); buffer.alloc(1); ASSERT_EQ(2, buffer.size()); + buffer.alloc(DynamicJsonBuffer::BLOCK_CAPACITY); + ASSERT_EQ(2 + DynamicJsonBuffer::BLOCK_CAPACITY, buffer.size()); } TEST_F(DynamicJsonBuffer_Basic_Tests, BlockCountDoesntChangeWhenNotFull) { @@ -43,8 +45,10 @@ TEST_F(DynamicJsonBuffer_Basic_Tests, BlockCountChangesWhenFull) { } TEST_F(DynamicJsonBuffer_Basic_Tests, CanAllocLessThanBlockCapacity) { - void* p = buffer.alloc(DynamicJsonBuffer::BLOCK_CAPACITY); - ASSERT_TRUE(p); + void* p1 = buffer.alloc(DynamicJsonBuffer::BLOCK_CAPACITY); + ASSERT_TRUE(p1); + void* p2 = buffer.alloc(DynamicJsonBuffer::BLOCK_CAPACITY); + ASSERT_TRUE(p2); } TEST_F(DynamicJsonBuffer_Basic_Tests, CantAllocMoreThanBlockCapacity) {