Fix splitString()/splitStringSimple() for case of empty trailing part
This commit is contained in:
parent
0fb533ffc5
commit
f549285fde
|
@ -114,7 +114,7 @@ set(META_APP_DESCRIPTION "Useful C++ classes and routines such as argument parse
|
||||||
set(META_FEATURES_FOR_COMPILER_DETECTION_HEADER cxx_thread_local)
|
set(META_FEATURES_FOR_COMPILER_DETECTION_HEADER cxx_thread_local)
|
||||||
set(META_VERSION_MAJOR 5)
|
set(META_VERSION_MAJOR 5)
|
||||||
set(META_VERSION_MINOR 10)
|
set(META_VERSION_MINOR 10)
|
||||||
set(META_VERSION_PATCH 2)
|
set(META_VERSION_PATCH 3)
|
||||||
|
|
||||||
# find required 3rd party libraries
|
# find required 3rd party libraries
|
||||||
include(3rdParty)
|
include(3rdParty)
|
||||||
|
|
|
@ -161,7 +161,8 @@ Container splitString(Detail::StringParamForContainer<Container> string, Detail:
|
||||||
Container res;
|
Container res;
|
||||||
typename Container::value_type *last = nullptr;
|
typename Container::value_type *last = nullptr;
|
||||||
bool merge = false;
|
bool merge = false;
|
||||||
for (typename Container::value_type::size_type i = 0, end = string.size(), delimPos; i < end; i = delimPos + delimiter.size()) {
|
typename Container::value_type::size_type i = 0, end = string.size();
|
||||||
|
for (typename Container::value_type::size_type delimPos; i < end; i = delimPos + delimiter.size()) {
|
||||||
delimPos = string.find(delimiter, i);
|
delimPos = string.find(delimiter, i);
|
||||||
if (!merge && maxParts >= 0 && res.size() == static_cast<typename Container::value_type::size_type>(maxParts)) {
|
if (!merge && maxParts >= 0 && res.size() == static_cast<typename Container::value_type::size_type>(maxParts)) {
|
||||||
if (delimPos == i && emptyPartsRole == EmptyPartsTreat::Merge) {
|
if (delimPos == i && emptyPartsRole == EmptyPartsTreat::Merge) {
|
||||||
|
@ -189,6 +190,9 @@ Container splitString(Detail::StringParamForContainer<Container> string, Detail:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (i == end && emptyPartsRole == EmptyPartsTreat::Keep) {
|
||||||
|
res.emplace_back();
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +211,8 @@ Container splitStringSimple(
|
||||||
{
|
{
|
||||||
--maxParts;
|
--maxParts;
|
||||||
Container res;
|
Container res;
|
||||||
for (typename Container::value_type::size_type i = 0, end = string.size(), delimPos; i < end; i = delimPos + delimiter.size()) {
|
typename Container::value_type::size_type i = 0, end = string.size();
|
||||||
|
for (typename Container::value_type::size_type delimPos; i < end; i = delimPos + delimiter.size()) {
|
||||||
delimPos = string.find(delimiter, i);
|
delimPos = string.find(delimiter, i);
|
||||||
if (maxParts >= 0 && res.size() == static_cast<typename Container::value_type::size_type>(maxParts)) {
|
if (maxParts >= 0 && res.size() == static_cast<typename Container::value_type::size_type>(maxParts)) {
|
||||||
delimPos = Container::value_type::npos;
|
delimPos = Container::value_type::npos;
|
||||||
|
@ -223,6 +228,17 @@ Container splitStringSimple(
|
||||||
} else {
|
} else {
|
||||||
res.emplace(string.data() + i, delimPos - i);
|
res.emplace(string.data() + i, delimPos - i);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (i == end) {
|
||||||
|
#if __cplusplus >= 201709
|
||||||
|
if constexpr (requires { res.emplace_back(); }) {
|
||||||
|
#endif
|
||||||
|
res.emplace_back();
|
||||||
|
#if __cplusplus >= 201709
|
||||||
|
} else {
|
||||||
|
res.emplace();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -295,6 +295,11 @@ void ConversionTests::testStringConversions()
|
||||||
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
||||||
splitTestActual = splitStringSimple<vector<string>>("1,2,3"s, ","s, 2);
|
splitTestActual = splitStringSimple<vector<string>>("1,2,3"s, ","s, 2);
|
||||||
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
||||||
|
splitTestExpected = { "12", "34", "56", "" };
|
||||||
|
splitTestActual = splitString<vector<string>>("12,34,56,"s, ","s);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
||||||
|
splitTestActual = splitStringSimple<vector<string>>("12,34,56,"s, ","s);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
||||||
splitTestExpected = { "1", "2,3", "4,,5" };
|
splitTestExpected = { "1", "2,3", "4,,5" };
|
||||||
splitTestActual = splitString<vector<string>>("1,2,,3,4,,5"s, ","s, EmptyPartsTreat::Merge, 3);
|
splitTestActual = splitString<vector<string>>("1,2,,3,4,,5"s, ","s, EmptyPartsTreat::Merge, 3);
|
||||||
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
|
||||||
|
|
Loading…
Reference in New Issue