Skip to content

Commit 28977d3

Browse files
-added join to string_utils;
-updated the version to 2.3.0
1 parent 45b0a39 commit 28977d3

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.18)
22

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

55
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
66
set(SFUN_SUBPROJECT OFF)

include/sfun/string_utils.h

+26
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,32 @@ inline std::string replace(std::string str, std::string_view subStr, std::string
134134
return str;
135135
}
136136

137+
template<typename TRange>
138+
std::string join(const TRange& range, std::string_view separator)
139+
{
140+
static_assert(std::is_constructible_v<std::string, decltype(*std::begin(range))>);
141+
142+
const auto size = [&] {
143+
auto res = std::size_t{};
144+
std::for_each(std::begin(range), std::end(range), [&res](const auto& val) {
145+
res += std::size(val);
146+
});
147+
if (std::size(range) > 0)
148+
res += (std::size(range) - 1) * separator.size();
149+
return res;
150+
}();
151+
152+
auto res = std::string{};
153+
res.reserve(size);
154+
std::for_each(std::begin(range), std::end(range), [&](const auto& val){
155+
res += std::string{val};
156+
res += std::string{separator};
157+
});
158+
if (!res.empty())
159+
res.resize(res.size() - separator.size());
160+
return res;
161+
}
162+
137163
inline bool startsWith(std::string_view str, std::string_view val)
138164
{
139165
auto res = str.find(val);

tests/test_string.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,46 @@ TEST(String, Replace)
6565
EXPECT_EQ(replace("", "", ""), "");
6666
}
6767

68+
TEST(String, Join)
69+
{
70+
{
71+
auto stringList = std::vector<std::string>{"a", "b", "c"};
72+
EXPECT_EQ(join(stringList, ""), "abc");
73+
EXPECT_EQ(join(stringList, ", "), "a, b, c");
74+
75+
stringList = {"a"};
76+
EXPECT_EQ(join(stringList, ""), "a");
77+
EXPECT_EQ(join(stringList, ", "), "a");
78+
79+
stringList = {};
80+
EXPECT_EQ(join(stringList, ""), "");
81+
EXPECT_EQ(join(stringList, ", "), "");
82+
}
83+
{
84+
auto viewList = std::vector<std::string_view>{"a", "b" , "c"};
85+
EXPECT_EQ(join(viewList, ""), "abc");
86+
EXPECT_EQ(join(viewList, ", "), "a, b, c");
87+
88+
viewList = {"a"};
89+
EXPECT_EQ(join(viewList, ""), "a");
90+
EXPECT_EQ(join(viewList, ", "), "a");
91+
92+
viewList = {};
93+
EXPECT_EQ(join(viewList, ""), "");
94+
EXPECT_EQ(join(viewList, ", "), "");
95+
}
96+
{
97+
EXPECT_EQ(join(std::vector<std::string>{"a", "b", "c"}, ""), "abc");
98+
EXPECT_EQ(join(std::vector<std::string>{"a", "b", "c"}, ", "), "a, b, c");
99+
100+
EXPECT_EQ(join(std::vector<std::string>{"a"}, ""), "a");
101+
EXPECT_EQ(join(std::vector<std::string>{"a"}, ", "), "a");
102+
103+
EXPECT_EQ(join(std::vector<std::string>{}, ""), "");
104+
EXPECT_EQ(join(std::vector<std::string>{}, ", "), "");
105+
}
106+
}
107+
68108
TEST(String, StartsWith)
69109
{
70110
EXPECT_TRUE(startsWith("hello world", "hell"));

0 commit comments

Comments
 (0)