Skip to content

Commit a2878af

Browse files
authored
Add the acceptEmptyString option when split a string (#84)
1 parent b78d36d commit a2878af

File tree

4 files changed

+154
-27
lines changed

4 files changed

+154
-27
lines changed

CMakeLists.txt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
cmake_minimum_required(VERSION 3.5)
22
project(trantor)
3-
add_library(${PROJECT_NAME} STATIC)
43

54
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/)
65

@@ -20,6 +19,18 @@ set(INSTALL_TRANTOR_CMAKE_DIR
2019
${DEF_INSTALL_TRANTOR_CMAKE_DIR}
2120
CACHE PATH "Installation directory for cmake files")
2221

22+
if(BUILD_TRANTOR_SHARED)
23+
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
24+
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
25+
"${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}" isSystemDir)
26+
if("${isSystemDir}" STREQUAL "-1")
27+
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}")
28+
endif("${isSystemDir}" STREQUAL "-1")
29+
add_library(${PROJECT_NAME} SHARED)
30+
else(BUILD_TRANTOR_SHARED)
31+
add_library(${PROJECT_NAME} STATIC)
32+
endif(BUILD_TRANTOR_SHARED)
33+
2334
# include directories
2435
target_include_directories(
2536
${PROJECT_NAME}

build.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22

3-
#building trantor
3+
#building trantor
44
function build_trantor() {
55

66
#Saving current directory
@@ -22,21 +22,21 @@ function build_trantor() {
2222

2323
echo "Start building trantor ..."
2424
if [ $1 -eq 1 ]; then
25-
cmake .. -DMAKETEST=YES
25+
cmake .. -DBUILD_TESTING=on
2626
else
2727
cmake ..
2828
fi
29-
29+
3030
#If errors then exit
3131
if [ "$?" != "0" ]; then
3232
exit -1
3333
fi
34-
34+
3535
make
36-
36+
3737
#If errors then exit
3838
if [ "$?" != "0" ]; then
39-
exit -1
39+
exit -1
4040
fi
4141

4242
echo "Installing ..."

trantor/unittests/splitStringUnittest.cc

Lines changed: 127 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,155 @@
33
#include <trantor/utils/Funcs.h>
44
#include <iostream>
55
using namespace trantor;
6-
TEST(splitString, split_string)
6+
TEST(splitString, ACCEPT_EMPTY_STRING1)
77
{
88
std::string originString = "1,2,3";
9-
auto out = splitString(originString, ",");
9+
auto out = splitString(originString, ",", true);
1010
EXPECT_EQ(out.size(), 3);
11-
originString = ",1,2,3";
12-
out = splitString(originString, ",");
11+
}
12+
TEST(splitString, ACCEPT_EMPTY_STRING2)
13+
{
14+
std::string originString = ",1,2,3";
15+
auto out = splitString(originString, ",", true);
1316
EXPECT_EQ(out.size(), 4);
1417
EXPECT_TRUE(out[0].empty());
15-
originString = ",1,2,3,";
16-
out = splitString(originString, ",");
18+
}
19+
TEST(splitString, ACCEPT_EMPTY_STRING3)
20+
{
21+
std::string originString = ",1,2,3,";
22+
auto out = splitString(originString, ",", true);
1723
EXPECT_EQ(out.size(), 5);
1824
EXPECT_TRUE(out[0].empty());
19-
originString = ",1,2,3,";
20-
out = splitString(originString, ":");
25+
}
26+
TEST(splitString, ACCEPT_EMPTY_STRING4)
27+
{
28+
std::string originString = ",1,2,3,";
29+
auto out = splitString(originString, ":", true);
2130
EXPECT_EQ(out.size(), 1);
22-
originString = "trantor::splitString";
23-
out = splitString(originString, "::");
31+
EXPECT_STREQ(out[0].data(), ",1,2,3,");
32+
}
33+
TEST(splitString, ACCEPT_EMPTY_STRING5)
34+
{
35+
std::string originString = "trantor::splitString";
36+
auto out = splitString(originString, "::", true);
2437
EXPECT_EQ(out.size(), 2);
2538
EXPECT_STREQ(out[0].data(), "trantor");
2639
EXPECT_STREQ(out[1].data(), "splitString");
27-
originString = "trantor::::splitString";
28-
out = splitString(originString, "::");
40+
}
41+
TEST(splitString, ACCEPT_EMPTY_STRING6)
42+
{
43+
std::string originString = "trantor::::splitString";
44+
auto out = splitString(originString, "::", true);
2945
EXPECT_EQ(out.size(), 3);
3046
EXPECT_STREQ(out[0].data(), "trantor");
3147
EXPECT_STREQ(out[1].data(), "");
3248
EXPECT_STREQ(out[2].data(), "splitString");
33-
originString = "trantor:::splitString";
34-
out = splitString(originString, "::");
49+
}
50+
TEST(splitString, ACCEPT_EMPTY_STRING7)
51+
{
52+
std::string originString = "trantor:::splitString";
53+
auto out = splitString(originString, "::", true);
3554
EXPECT_EQ(out.size(), 2);
3655
EXPECT_STREQ(out[0].data(), "trantor");
3756
EXPECT_STREQ(out[1].data(), ":splitString");
38-
originString = "trantor:::splitString";
39-
out = splitString(originString, "trantor:::splitString");
57+
}
58+
TEST(splitString, ACCEPT_EMPTY_STRING8)
59+
{
60+
std::string originString = "trantor:::splitString";
61+
auto out = splitString(originString, "trantor:::splitString", true);
4062
EXPECT_EQ(out.size(), 2);
4163
EXPECT_STREQ(out[0].data(), "");
4264
EXPECT_STREQ(out[1].data(), "");
4365
}
66+
TEST(splitString, ACCEPT_EMPTY_STRING9)
67+
{
68+
std::string originString = "";
69+
auto out = splitString(originString, ",", true);
70+
EXPECT_EQ(out.size(), 1);
71+
EXPECT_STREQ(out[0].data(), "");
72+
}
73+
TEST(splitString, ACCEPT_EMPTY_STRING10)
74+
{
75+
std::string originString = "trantor";
76+
auto out = splitString(originString, "", true);
77+
EXPECT_EQ(out.size(), 0);
78+
}
79+
TEST(splitString, ACCEPT_EMPTY_STRING11)
80+
{
81+
std::string originString = "";
82+
auto out = splitString(originString, "", true);
83+
EXPECT_EQ(out.size(), 0);
84+
}
85+
86+
TEST(splitString, NO_ACCEPT_EMPTY_STRING1)
87+
{
88+
std::string originString = ",1,2,3";
89+
auto out = splitString(originString, ",");
90+
EXPECT_EQ(out.size(), 3);
91+
EXPECT_STREQ(out[0].data(), "1");
92+
}
93+
TEST(splitString, NO_ACCEPT_EMPTY_STRING2)
94+
{
95+
std::string originString = ",1,2,3,";
96+
auto out = splitString(originString, ",");
97+
EXPECT_EQ(out.size(), 3);
98+
EXPECT_STREQ(out[0].data(), "1");
99+
}
100+
TEST(splitString, NO_ACCEPT_EMPTY_STRING3)
101+
{
102+
std::string originString = ",1,2,3,";
103+
auto out = splitString(originString, ":");
104+
EXPECT_EQ(out.size(), 1);
105+
EXPECT_STREQ(out[0].data(), ",1,2,3,");
106+
}
107+
TEST(splitString, NO_ACCEPT_EMPTY_STRING4)
108+
{
109+
std::string originString = "trantor::splitString";
110+
auto out = splitString(originString, "::");
111+
EXPECT_EQ(out.size(), 2);
112+
EXPECT_STREQ(out[0].data(), "trantor");
113+
EXPECT_STREQ(out[1].data(), "splitString");
114+
}
115+
TEST(splitString, NO_ACCEPT_EMPTY_STRING5)
116+
{
117+
std::string originString = "trantor::::splitString";
118+
auto out = splitString(originString, "::");
119+
EXPECT_EQ(out.size(), 2);
120+
EXPECT_STREQ(out[0].data(), "trantor");
121+
EXPECT_STREQ(out[1].data(), "splitString");
122+
}
123+
TEST(splitString, NO_ACCEPT_EMPTY_STRING6)
124+
{
125+
std::string originString = "trantor:::splitString";
126+
auto out = splitString(originString, "::");
127+
EXPECT_EQ(out.size(), 2);
128+
EXPECT_STREQ(out[0].data(), "trantor");
129+
EXPECT_STREQ(out[1].data(), ":splitString");
130+
}
131+
TEST(splitString, NO_ACCEPT_EMPTY_STRING7)
132+
{
133+
std::string originString = "trantor:::splitString";
134+
auto out = splitString(originString, "trantor:::splitString");
135+
EXPECT_EQ(out.size(), 0);
136+
}
137+
TEST(splitString, NO_ACCEPT_EMPTY_STRING8)
138+
{
139+
std::string originString = "";
140+
auto out = splitString(originString, ",");
141+
EXPECT_EQ(out.size(), 0);
142+
}
143+
TEST(splitString, NO_ACCEPT_EMPTY_STRING9)
144+
{
145+
std::string originString = "trantor";
146+
auto out = splitString(originString, "");
147+
EXPECT_EQ(out.size(), 0);
148+
}
149+
TEST(splitString, NO_ACCEPT_EMPTY_STRING10)
150+
{
151+
std::string originString = "";
152+
auto out = splitString(originString, "");
153+
EXPECT_EQ(out.size(), 0);
154+
}
44155
int main(int argc, char **argv)
45156
{
46157
testing::InitGoogleTest(&argc, argv);

trantor/utils/Funcs.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,22 @@ inline uint64_t ntoh64(uint64_t n)
3232
return hton64(n);
3333
}
3434
inline std::vector<std::string> splitString(const std::string &s,
35-
const std::string &delimiter)
35+
const std::string &delimiter,
36+
bool acceptEmptyString = false)
3637
{
38+
if (delimiter.empty())
39+
return std::vector<std::string>{};
40+
std::vector<std::string> v;
3741
size_t last = 0;
3842
size_t next = 0;
39-
std::vector<std::string> v;
4043
while ((next = s.find(delimiter, last)) != std::string::npos)
4144
{
42-
v.push_back(s.substr(last, next - last));
45+
if (next > last || acceptEmptyString)
46+
v.push_back(s.substr(last, next - last));
4347
last = next + delimiter.length();
4448
}
45-
v.push_back(s.substr(last));
49+
if (s.length() > last || acceptEmptyString)
50+
v.push_back(s.substr(last));
4651
return std::move(v);
4752
}
4853
} // namespace trantor

0 commit comments

Comments
 (0)