From 7515e733db1a0741e6e7d626c7cd6fdcc3c957be Mon Sep 17 00:00:00 2001 From: Kishore Nallan Date: Wed, 3 May 2023 13:47:30 +0530 Subject: [PATCH] Move range facet parsing to cpp file. --- include/string_utils.h | 49 +------------------------------------ src/string_utils.cpp | 50 ++++++++++++++++++++++++++++++++++++++ test/string_utils_test.cpp | 17 ++++++------- 3 files changed, 58 insertions(+), 58 deletions(-) diff --git a/include/string_utils.h b/include/string_utils.h index d35754c5..288068a6 100644 --- a/include/string_utils.h +++ b/include/string_utils.h @@ -23,54 +23,7 @@ struct StringUtils { static size_t split_facet(const std::string& s, std::vector & result, const bool keep_empty = false, const size_t start_index = 0, - const size_t max_values = (std::numeric_limits::max()-1)) { - - - std::string::const_iterator substart = s.begin()+start_index, subend; - size_t end_index = start_index; - std::string delim(""), temp(""); - std::string current_str=s; - while (true) { - auto range_pos = current_str.find("("); - auto normal_pos = current_str.find(","); - - if(range_pos == std::string::npos && normal_pos == std::string::npos){ - if(!current_str.empty()){ - result.push_back(trim(current_str)); - } - break; - } - else if(range_pos < normal_pos){ - delim="),"; - subend = std::search(substart, s.end(), delim.begin(), delim.end()); - temp = std::string(substart, subend); - } - else{ - delim=","; - subend = std::search(substart, s.end(), delim.begin(), delim.end()); - temp = std::string(substart, subend); - } - - end_index += temp.size() + delim.size(); - temp = trim(temp); - - if (keep_empty || !temp.empty()) { - result.push_back(temp); - } - - if(result.size() == max_values) { - break; - } - - if (subend == s.end()) { - break; - } - substart = subend + delim.size(); - current_str = std::string(substart, s.end()); - } - - return std::min(end_index, s.size()); - } + const size_t max_values = (std::numeric_limits::max()-1)); // Adapted from: http://stackoverflow.com/a/236180/131050 static size_t split(const std::string& s, std::vector & result, const std::string& delim, diff --git a/src/string_utils.cpp b/src/string_utils.cpp index a5ce52af..b2caf445 100644 --- a/src/string_utils.cpp +++ b/src/string_utils.cpp @@ -490,6 +490,56 @@ Option StringUtils::split_include_fields(const std::string& include_fields return Option(true); } +size_t StringUtils::split_facet(const std::string &s, std::vector &result, const bool keep_empty, + const size_t start_index, const size_t max_values) { + + + std::string::const_iterator substart = s.begin()+start_index, subend; + size_t end_index = start_index; + std::string delim(""), temp(""); + std::string current_str=s; + while (true) { + auto range_pos = current_str.find("("); + auto normal_pos = current_str.find(","); + + if(range_pos == std::string::npos && normal_pos == std::string::npos){ + if(!current_str.empty()){ + result.push_back(trim(current_str)); + } + break; + } + else if(range_pos < normal_pos){ + delim="),"; + subend = std::search(substart, s.end(), delim.begin(), delim.end()); + temp = std::string(substart, subend) + (*subend == ')' ? ")" : ""); + } + else{ + delim=","; + subend = std::search(substart, s.end(), delim.begin(), delim.end()); + temp = std::string(substart, subend); + } + + end_index += temp.size() + delim.size(); + temp = trim(temp); + + if (keep_empty || !temp.empty()) { + result.push_back(temp); + } + + if(result.size() == max_values) { + break; + } + + if (subend == s.end()) { + break; + } + substart = subend + delim.size(); + current_str = std::string(substart, s.end()); + } + + return std::min(end_index, s.size()); +} + /*size_t StringUtils::unicode_length(const std::string& bytes) { std::wstring_convert, char32_t> utf8conv; return utf8conv.from_bytes(bytes).size(); diff --git a/test/string_utils_test.cpp b/test/string_utils_test.cpp index 31acfafb..8fa60a92 100644 --- a/test/string_utils_test.cpp +++ b/test/string_utils_test.cpp @@ -322,24 +322,21 @@ TEST(StringUtilsTest, ShouldSplitRangeFacet){ std::string range_facets_string = "score(fail:[0, 40], pass:[40, 100]), grade(A:[80,100], B:[60, 80], C:[40, 60])"; std::vector range_facets; StringUtils::split_facet(range_facets_string, range_facets); - ASSERT_STREQ("score(fail:[0, 40], pass:[40, 100])", range_facets[0].c_str()); - ASSERT_STREQ("grade(A:[80,100], B:[60, 80], C:[40, 60])", range_facets[1].c_str()); - + ASSERT_EQ("score(fail:[0, 40], pass:[40, 100])", range_facets[0]); + ASSERT_EQ("grade(A:[80,100], B:[60, 80], C:[40, 60])", range_facets[1]); std::string facets_string = "score, grade"; std::vector facets; StringUtils::split_facet(facets_string, facets); - ASSERT_STREQ("score", facets[0].c_str()); - ASSERT_STREQ("grade", facets[1].c_str()); - + ASSERT_EQ("score", facets[0]); + ASSERT_EQ("grade", facets[1]); std::string mixed_facets_string = "score, grade(A:[80,100], B:[60, 80], C:[40, 60]), rank"; std::vector mixed_facets; StringUtils::split_facet(mixed_facets_string, mixed_facets); - ASSERT_STREQ("score", mixed_facets[0].c_str()); - ASSERT_STREQ("grade(A:[80,100], B:[60, 80], C:[40, 60])", mixed_facets[1].c_str()); - ASSERT_STREQ("rank", mixed_facets[2].c_str()); - + ASSERT_EQ("score", mixed_facets[0]); + ASSERT_EQ("grade(A:[80,100], B:[60, 80], C:[40, 60])", mixed_facets[1]); + ASSERT_EQ("rank", mixed_facets[2]); // empty string should produce empty list std::vector lines_empty;