diff --git a/src/libs/utils/smallstring.h b/src/libs/utils/smallstring.h index eae9c29dc46..82bf50440fe 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -240,6 +240,7 @@ public: m_data.allocated.data.capacity = newCapacity; } else { const size_type oldSize = size(); + newCapacity = std::max(newCapacity, oldSize); const char *oldData = data(); char *newData = Memory::allocate(newCapacity + 1); diff --git a/tests/unit/unittest/smallstring-test.cpp b/tests/unit/unittest/smallstring-test.cpp index 05925d72b6c..3bbb10c6539 100644 --- a/tests/unit/unittest/smallstring-test.cpp +++ b/tests/unit/unittest/smallstring-test.cpp @@ -815,25 +815,43 @@ TEST(SmallString, EndsWithSmallString) ASSERT_TRUE(text.endsWith('h')); } -TEST(SmallString, ReserveSmallerThanReference) +TEST(SmallString, ReserveSmallerThanShortStringCapacity) { SmallString text("text"); text.reserve(2); - ASSERT_THAT(text.capacity(), 30); + ASSERT_THAT(text.capacity(), AnyOf(30, 4)); } -TEST(SmallString, ReserveBiggerThanReference) +TEST(SmallString, ReserveSmallerThanReference) +{ + SmallString text("some very very very very very very very very very very very long string"); + + text.reserve(35); + + ASSERT_THAT(text.capacity(), 71); +} + +TEST(SmallString, ReserveBiggerThanShortStringCapacity) { SmallString text("text"); text.reserve(10); - ASSERT_THAT(text.capacity(), 30); + ASSERT_THAT(text.capacity(), AnyOf(30, 10)); } -TEST(SmallString, ReserveMuchBiggerThanReference) +TEST(SmallString, ReserveBiggerThanReference) +{ + SmallString text("some very very very very very very very very very very very long string"); + + text.reserve(35); + + ASSERT_THAT(text.capacity(), 71); +} + +TEST(SmallString, ReserveMuchBiggerThanShortStringCapacity) { SmallString text("text");