diff --git a/src/libs/utils/smallstring.h b/src/libs/utils/smallstring.h index 359b5a2e81e..fd5e208ecf1 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include #include #include @@ -135,6 +137,28 @@ public: { } + BasicSmallString(std::initializer_list list) + { + std::size_t size = std::accumulate(list.begin(), + list.end(), + std::size_t(0), + [] (std::size_t size, Utils::SmallStringView string) { + return size + string.size(); + }); + + reserve(size); + setSize(size); + + char *currentData = data(); + + for (Utils::SmallStringView string : list) { + std::memcpy(currentData, string.data(), string.size()); + + currentData += string.size(); + } + + at(size) = 0; + } ~BasicSmallString() noexcept { diff --git a/tests/unit/unittest/smallstring-test.cpp b/tests/unit/unittest/smallstring-test.cpp index d846395c3ae..a0f2201bf7a 100644 --- a/tests/unit/unittest/smallstring-test.cpp +++ b/tests/unit/unittest/smallstring-test.cpp @@ -1186,3 +1186,45 @@ TEST(SmallString, ManipulateNonConstSubscriptOperator) ASSERT_THAT(text, SmallString{"some qext"}); } + +TEST(SmallString, EmptyInitializerListContent) +{ + SmallString text = {}; + + ASSERT_THAT(text, SmallString()); +} + +TEST(SmallString, EmptyInitializerListSize) +{ + SmallString text = {}; + + ASSERT_THAT(text, SizeIs(0)); +} + +TEST(SmallString, EmptyInitializerListNullTerminated) +{ + auto end = SmallString{{}}[0]; + + ASSERT_THAT(end, '\0'); +} + +TEST(SmallString, InitializerListContent) +{ + SmallString text = {"some", " ", "text"}; + + ASSERT_THAT(text, SmallString("some text")); +} + +TEST(SmallString, InitializerListSize) +{ + SmallString text = {"some", " ", "text"}; + + ASSERT_THAT(text, SizeIs(9)); +} + +TEST(SmallString, InitializerListNullTerminated) +{ + auto end = SmallString{"some", " ", "text"}[9]; + + ASSERT_THAT(end, '\0'); +}