diff --git a/src/basics/CMakeLists.txt b/src/basics/CMakeLists.txt index 5bb35b856ed331f0de43b5d913d8fed05283e1ec..9e876d834508af0d340bfe4cdd18bcc6a37d3b11 100644 --- a/src/basics/CMakeLists.txt +++ b/src/basics/CMakeLists.txt @@ -53,7 +53,5 @@ target_include_directories(${library_name} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Cor target_include_directories(${library_name} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) include (${CMAKE_PATH}/3rd/mpi.cmake) -include (${CMAKE_PATH}/3rd/boost.cmake) -linkBoost ("") vf_add_tests() \ No newline at end of file diff --git a/src/basics/Core/StringUtilities/StringUtil.cpp b/src/basics/Core/StringUtilities/StringUtil.cpp index b98b13fd520542d6624158a53c1856c1ea17992c..42e8669c3e907c6f149b9bd4418a12fe73e7d211 100644 --- a/src/basics/Core/StringUtilities/StringUtil.cpp +++ b/src/basics/Core/StringUtilities/StringUtil.cpp @@ -1,6 +1,7 @@ #include "StringUtil.h" -#include <boost/algorithm/string.hpp> +#include <regex> +#include <sstream> std::string StringUtil::findAndReplace(const std::string &source, const std::string& find, const std::string& replace) { @@ -97,11 +98,27 @@ std::vector<std::string> split(const std::string& str, char delim = ' ') return list; } +std::vector<std::string> StringUtil::split(const std::string& input, const std::string& delim/*= " "*/) +{ + std::stringstream ss; + ss << "[" << delim << "]"; + + std::regex re(ss.str()); + std::sregex_token_iterator first{input.begin(), input.end(), re, -1}, last; //the '-1' is what makes the regex split (-1 := what was not matched) + std::vector<std::string> tokens{first, last}; + tokens.erase(std::remove_if(tokens.begin(), tokens.end(), [](std::string& token) + { + return token.empty(); + }), tokens.end()); + + return tokens; +} + std::vector<int> StringUtil::toIntVector(const std::string& input) { std::vector<int> v; std::vector<std::string> inputEntries; - boost::algorithm::split(inputEntries, input, boost::is_any_of("\t\n ")); + inputEntries = split(input, " \n\t"); for(std::string entry : inputEntries) if (entry != "") v.push_back(toInt(entry)); @@ -112,7 +129,7 @@ std::vector<unsigned int> StringUtil::toUintVector(const std::string & input) { std::vector<unsigned int> v; std::vector<std::string> inputEntries; - boost::algorithm::split(inputEntries, input, boost::is_any_of("\t\n ")); + inputEntries = split(input, " \n\t"); for(std::string entry : inputEntries) if (entry != "") v.push_back(toInt(entry)); @@ -123,7 +140,7 @@ std::vector<bool> StringUtil::toBoolVector(const std::string & input) { std::vector<bool> v; std::vector<std::string> inputEntries; - boost::algorithm::split(inputEntries, input, boost::is_any_of("\t\n ")); + inputEntries = split(input, " \n\t"); for(std::string entry : inputEntries) { bool b = 0; @@ -136,20 +153,14 @@ std::vector<bool> StringUtil::toBoolVector(const std::string & input) std::vector<std::string> StringUtil::toStringVector(const std::string & input) { - std::vector<std::string> v; - std::vector<std::string> inputEntries; - boost::algorithm::split(inputEntries, input, boost::is_any_of("\t\n ")); - for(std::string entry : inputEntries) - if (entry != "") - v.push_back(toString(entry)); - return v; + return split(input, " \n\t"); } BASICS_EXPORT std::vector<double> StringUtil::toDoubleVector(const std::string & input) { std::vector<double> v; std::vector<std::string> inputEntries; - boost::algorithm::split(inputEntries, input, boost::is_any_of("\t\n ")); + inputEntries = split(input, " \n\t"); for(std::string entry : inputEntries) if (entry != "") v.push_back(toDouble(entry)); diff --git a/src/basics/Core/StringUtilities/StringUtil.h b/src/basics/Core/StringUtilities/StringUtil.h index dd7f77986f3b15d4f875d2a6f1c177553bac96e3..e860418cb826b800701c1ede60a378fa07f8cf92 100644 --- a/src/basics/Core/StringUtilities/StringUtil.h +++ b/src/basics/Core/StringUtilities/StringUtil.h @@ -18,6 +18,7 @@ public: static BASICS_EXPORT std::string findAndReplace(const std::string &source, const std::string& find, const std::string& replace); static BASICS_EXPORT std::string makeUpper(const std::string& instring); static BASICS_EXPORT std::string makeLower(const std::string& instring); + static BASICS_EXPORT std::vector<std::string> split(const std::string& input, const std::string& delim = " "); static BASICS_EXPORT bool contains(const std::string& source, const char *find); static BASICS_EXPORT std::string pad(const std::string& input, char pad, int length); static BASICS_EXPORT std::string trim(const std::string &input, const std::string &trim = std::string(" \t\n")); diff --git a/src/basics/Core/StringUtilities/StringUtilTest.cpp b/src/basics/Core/StringUtilities/StringUtilTest.cpp index 48df13bc2a1fe4c65b3c5c396876a7a5d29491ea..e87e15423ec74258f3be9a565c118954355aff38 100644 --- a/src/basics/Core/StringUtilities/StringUtilTest.cpp +++ b/src/basics/Core/StringUtilities/StringUtilTest.cpp @@ -36,5 +36,26 @@ TEST(StringUtilTest, toIntVector) auto result = StringUtil::toIntVector(input); + ASSERT_THAT(result,testing::Eq(expected_result)); +} + +TEST(StringUtilTest, splitIntoStringsWithDelimeter) +{ + const std::string input {"1 2\n3 4\t5"}; + const std::string delimeter {" \n\t"}; + std::vector<std::string> expected_result {"1", "2", "3", "4", "5"}; + + auto result = StringUtil::split(input, delimeter); + + ASSERT_THAT(result,testing::Eq(expected_result)); +} + +TEST(StringUtilTest, toStringVector) +{ + const std::string input {"1 2\n3 4\t5"}; + std::vector<std::string> expected_result {"1", "2", "3", "4", "5"}; + + auto result = StringUtil::toStringVector(input); + ASSERT_THAT(result,testing::Eq(expected_result)); } \ No newline at end of file