Skip to content

Commit

Permalink
-added join to string_utils;
Browse files Browse the repository at this point in the history
-updated the version to 2.3.0
  • Loading branch information
kamchatka-volcano committed Sep 7, 2022
1 parent 45b0a39 commit 28977d3
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.18)

project(sfun VERSION 2.2.0 DESCRIPTION "stuff from unnamed namespaces - a c++17 helper library")
project(sfun VERSION 2.3.0 DESCRIPTION "stuff from unnamed namespaces - a c++17 helper library")

if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(SFUN_SUBPROJECT OFF)
Expand Down
26 changes: 26 additions & 0 deletions include/sfun/string_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,32 @@ inline std::string replace(std::string str, std::string_view subStr, std::string
return str;
}

template<typename TRange>
std::string join(const TRange& range, std::string_view separator)
{
static_assert(std::is_constructible_v<std::string, decltype(*std::begin(range))>);

const auto size = [&] {
auto res = std::size_t{};
std::for_each(std::begin(range), std::end(range), [&res](const auto& val) {
res += std::size(val);
});
if (std::size(range) > 0)
res += (std::size(range) - 1) * separator.size();
return res;
}();

auto res = std::string{};
res.reserve(size);
std::for_each(std::begin(range), std::end(range), [&](const auto& val){
res += std::string{val};
res += std::string{separator};
});
if (!res.empty())
res.resize(res.size() - separator.size());
return res;
}

inline bool startsWith(std::string_view str, std::string_view val)
{
auto res = str.find(val);
Expand Down
40 changes: 40 additions & 0 deletions tests/test_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,46 @@ TEST(String, Replace)
EXPECT_EQ(replace("", "", ""), "");
}

TEST(String, Join)
{
{
auto stringList = std::vector<std::string>{"a", "b", "c"};
EXPECT_EQ(join(stringList, ""), "abc");
EXPECT_EQ(join(stringList, ", "), "a, b, c");

stringList = {"a"};
EXPECT_EQ(join(stringList, ""), "a");
EXPECT_EQ(join(stringList, ", "), "a");

stringList = {};
EXPECT_EQ(join(stringList, ""), "");
EXPECT_EQ(join(stringList, ", "), "");
}
{
auto viewList = std::vector<std::string_view>{"a", "b" , "c"};
EXPECT_EQ(join(viewList, ""), "abc");
EXPECT_EQ(join(viewList, ", "), "a, b, c");

viewList = {"a"};
EXPECT_EQ(join(viewList, ""), "a");
EXPECT_EQ(join(viewList, ", "), "a");

viewList = {};
EXPECT_EQ(join(viewList, ""), "");
EXPECT_EQ(join(viewList, ", "), "");
}
{
EXPECT_EQ(join(std::vector<std::string>{"a", "b", "c"}, ""), "abc");
EXPECT_EQ(join(std::vector<std::string>{"a", "b", "c"}, ", "), "a, b, c");

EXPECT_EQ(join(std::vector<std::string>{"a"}, ""), "a");
EXPECT_EQ(join(std::vector<std::string>{"a"}, ", "), "a");

EXPECT_EQ(join(std::vector<std::string>{}, ""), "");
EXPECT_EQ(join(std::vector<std::string>{}, ", "), "");
}
}

TEST(String, StartsWith)
{
EXPECT_TRUE(startsWith("hello world", "hell"));
Expand Down

0 comments on commit 28977d3

Please sign in to comment.