diff options
| author | Billy O'Neal <bion@microsoft.com> | 2020-05-19 15:05:53 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-19 15:05:53 -0700 |
| commit | 0116b86e38517d9f430e150feb19914915b734da (patch) | |
| tree | f6bedf9495cb807a9f9d5f75daa0a76bfd7d1ae6 /toolsrc/src | |
| parent | 9a0652b87002b671a3dd90038461f912d368a398 (diff) | |
| download | vcpkg-0116b86e38517d9f430e150feb19914915b734da.tar.gz vcpkg-0116b86e38517d9f430e150feb19914915b734da.zip | |
[vcpkg] Optimize string split slightly. (#11433)
Diffstat (limited to 'toolsrc/src')
| -rw-r--r-- | toolsrc/src/vcpkg-test/strings.cpp | 20 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/base/files.cpp | 4 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/base/strings.cpp | 66 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/base/system.process.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/build.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/cmakevars.cpp | 4 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/commands.autocomplete.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/commands.ci.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/commands.porthistory.cpp | 4 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/logicexpression.cpp | 2 |
11 files changed, 40 insertions, 70 deletions
diff --git a/toolsrc/src/vcpkg-test/strings.cpp b/toolsrc/src/vcpkg-test/strings.cpp index d58d1b172..eb1f5697f 100644 --- a/toolsrc/src/vcpkg-test/strings.cpp +++ b/toolsrc/src/vcpkg-test/strings.cpp @@ -2,15 +2,16 @@ #include <vcpkg/base/strings.h> -#include <cstdint> +#include <stdint.h> #include <utility> #include <vector> +#include <string> TEST_CASE ("b32 encoding", "[strings]") { - using u64 = std::uint64_t; + using u64 = uint64_t; - std::vector<std::pair<std::uint64_t, std::string>> map; + std::vector<std::pair<u64, std::string>> map; map.emplace_back(0, "AAAAAAAAAAAAA"); map.emplace_back(1, "BAAAAAAAAAAAA"); @@ -24,10 +25,19 @@ TEST_CASE ("b32 encoding", "[strings]") map.emplace_back(0x1405'64E7'FE7E'A88C, "MEK5H774ELBIB"); map.emplace_back(0xFFFF'FFFF'FFFF'FFFF, "777777777777P"); - std::string result; for (const auto& pr : map) { - result = vcpkg::Strings::b32_encode(pr.first); REQUIRE(vcpkg::Strings::b32_encode(pr.first) == pr.second); } } + +TEST_CASE ("split by char", "[strings]") +{ + using vcpkg::Strings::split; + using result_t = std::vector<std::string>; + REQUIRE(split(",,,,,,", ',').empty()); + REQUIRE(split(",,a,,b,,", ',') == result_t{"a", "b"}); + REQUIRE(split("hello world", ' ') == result_t{"hello", "world"}); + REQUIRE(split(" hello world ", ' ') == result_t{"hello", "world"}); + REQUIRE(split("no delimiters", ',') == result_t{"no delimiters"}); +} diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp index a249a3d9d..7f9decce1 100644 --- a/toolsrc/src/vcpkg.cpp +++ b/toolsrc/src/vcpkg.cpp @@ -341,7 +341,7 @@ int main(const int argc, const char* const* const argv) const auto vcpkg_feature_flags_env = System::get_environment_variable("VCPKG_FEATURE_FLAGS"); if (const auto v = vcpkg_feature_flags_env.get()) { - auto flags = Strings::split(*v, ","); + auto flags = Strings::split(*v, ','); if (std::find(flags.begin(), flags.end(), "binarycaching") != flags.end()) GlobalState::g_binary_caching = true; } diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 24e2038d9..7f4d18616 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -834,10 +834,10 @@ namespace vcpkg::Files { #if defined(_WIN32) static constexpr StringLiteral EXTS[] = {".cmd", ".exe", ".bat"}; - auto paths = Strings::split(System::get_environment_variable("PATH").value_or_exit(VCPKG_LINE_INFO), ";"); + auto paths = Strings::split(System::get_environment_variable("PATH").value_or_exit(VCPKG_LINE_INFO), ';'); #else // ^^^ defined(_WIN32) // !defined(_WIN32) vvv static constexpr StringLiteral EXTS[] = {""}; - auto paths = Strings::split(System::get_environment_variable("PATH").value_or_exit(VCPKG_LINE_INFO), ":"); + auto paths = Strings::split(System::get_environment_variable("PATH").value_or_exit(VCPKG_LINE_INFO), ':'); #endif // ^^^ !defined(_WIN32) std::vector<fs::path> ret; diff --git a/toolsrc/src/vcpkg/base/strings.cpp b/toolsrc/src/vcpkg/base/strings.cpp index d9dc4c088..167053d70 100644 --- a/toolsrc/src/vcpkg/base/strings.cpp +++ b/toolsrc/src/vcpkg/base/strings.cpp @@ -157,63 +157,23 @@ void Strings::trim_all_and_remove_whitespace_strings(std::vector<std::string>* s Util::erase_remove_if(*strings, [](const std::string& s) { return s.empty(); }); } -std::vector<std::string> Strings::split(const std::string& s, const std::string& delimiter) +std::vector<std::string> Strings::split(const std::string& s, const char delimiter) { std::vector<std::string> output; - - if (delimiter.empty()) - { - output.push_back(s); - return output; - } - - const size_t delimiter_length = delimiter.length(); - size_t i = 0; - for (size_t pos = s.find(delimiter); pos != std::string::npos; pos = s.find(delimiter, pos)) - { - output.push_back(s.substr(i, pos - i)); - pos += delimiter_length; - i = pos; - } - - // Add the rest of the string after the last delimiter, unless there is nothing after it - if (i != s.length()) - { - output.push_back(s.substr(i, s.length())); - } - - return output; -} - -std::vector<std::string> Strings::split(const std::string& s, const std::string& delimiter, size_t max_count) -{ - std::vector<std::string> output; - - Checks::check_exit(VCPKG_LINE_INFO, max_count >= 1); - - if (delimiter.empty()) - { - output.push_back(s); - return output; - } - - const size_t delimiter_length = delimiter.length(); - size_t i = 0; - for (size_t pos = s.find(delimiter); pos != std::string::npos; pos = s.find(delimiter, pos)) + auto first = s.begin(); + const auto last = s.end(); + for (;;) { - if (output.size() == max_count - 1) break; - output.push_back(s.substr(i, pos - i)); - pos += delimiter_length; - i = pos; - } + first = std::find_if(first, last, [=](const char c) { return c != delimiter; }); + if (first == last) + { + return output; + } - // Add the rest of the string after the last delimiter, unless there is nothing after it - if (i != s.length()) - { - output.push_back(s.substr(i, s.length())); + auto next = std::find(first, last, delimiter); + output.emplace_back(first, next); + first = next; } - - return output; } std::vector<StringView> Strings::find_all_enclosed(StringView input, StringView left_delim, StringView right_delim) @@ -223,7 +183,7 @@ std::vector<StringView> Strings::find_all_enclosed(StringView input, StringView std::vector<StringView> output; - while (true) + for (;;) { it_left = std::search(it_right, input.end(), left_delim.begin(), left_delim.end()); if (it_left == input.end()) break; diff --git a/toolsrc/src/vcpkg/base/system.process.cpp b/toolsrc/src/vcpkg/base/system.process.cpp index 74c4390cc..e6e195010 100644 --- a/toolsrc/src/vcpkg/base/system.process.cpp +++ b/toolsrc/src/vcpkg/base/system.process.cpp @@ -267,7 +267,7 @@ namespace vcpkg if (k && !k->empty()) { - auto vars = Strings::split(*k, ";"); + auto vars = Strings::split(*k, ';'); for (auto&& var : vars) { diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index a1a520970..675c75ea5 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -1057,7 +1057,7 @@ namespace vcpkg::Build VCPKG_LINE_INFO, "Unknown setting for VCPKG_BUILD_TYPE: %s", variable_value);
break;
case VcpkgTripletVar::ENV_PASSTHROUGH:
- passthrough_env_vars = Strings::split(variable_value, ";");
+ passthrough_env_vars = Strings::split(variable_value, ';');
break;
case VcpkgTripletVar::PUBLIC_ABI_OVERRIDE:
public_abi_override = variable_value.empty() ? nullopt : Optional<std::string>{variable_value};
diff --git a/toolsrc/src/vcpkg/cmakevars.cpp b/toolsrc/src/vcpkg/cmakevars.cpp index 98b2546ed..114335e2c 100644 --- a/toolsrc/src/vcpkg/cmakevars.cpp +++ b/toolsrc/src/vcpkg/cmakevars.cpp @@ -174,7 +174,7 @@ namespace vcpkg::CMakeVars const auto ec_data = System::cmd_execute_and_capture_output(cmd_launch_cmake); Checks::check_exit(VCPKG_LINE_INFO, ec_data.exit_code == 0, ec_data.output); - const std::vector<std::string> lines = Strings::split(ec_data.output, "\n"); + const std::vector<std::string> lines = Strings::split(ec_data.output, '\n'); const auto end = lines.cend(); @@ -192,7 +192,7 @@ namespace vcpkg::CMakeVars { const std::string& line = *block_start; - std::vector<std::string> s = Strings::split(line, "="); + std::vector<std::string> s = Strings::split(line, '='); Checks::check_exit(VCPKG_LINE_INFO, s.size() == 1 || s.size() == 2, "Expected format is [VARIABLE_NAME=VARIABLE_VALUE], but was [%s]", diff --git a/toolsrc/src/vcpkg/commands.autocomplete.cpp b/toolsrc/src/vcpkg/commands.autocomplete.cpp index 2857988ba..6b09e36f3 100644 --- a/toolsrc/src/vcpkg/commands.autocomplete.cpp +++ b/toolsrc/src/vcpkg/commands.autocomplete.cpp @@ -30,7 +30,7 @@ namespace vcpkg::Commands::Autocomplete { Metrics::g_metrics.lock()->set_send_metrics(false); const std::string to_autocomplete = Strings::join(" ", args.command_arguments); - const std::vector<std::string> tokens = Strings::split(to_autocomplete, " "); + const std::vector<std::string> tokens = Strings::split(to_autocomplete, ' '); std::smatch match; diff --git a/toolsrc/src/vcpkg/commands.ci.cpp b/toolsrc/src/vcpkg/commands.ci.cpp index eadfd8bdd..1e06be37d 100644 --- a/toolsrc/src/vcpkg/commands.ci.cpp +++ b/toolsrc/src/vcpkg/commands.ci.cpp @@ -407,7 +407,7 @@ namespace vcpkg::Commands::CI auto it_exclusions = options.settings.find(OPTION_EXCLUDE); if (it_exclusions != options.settings.end()) { - auto exclusions = Strings::split(it_exclusions->second, ","); + auto exclusions = Strings::split(it_exclusions->second, ','); exclusions_set.insert(exclusions.begin(), exclusions.end()); } diff --git a/toolsrc/src/vcpkg/commands.porthistory.cpp b/toolsrc/src/vcpkg/commands.porthistory.cpp index 44fccbb7f..e60e7dc63 100644 --- a/toolsrc/src/vcpkg/commands.porthistory.cpp +++ b/toolsrc/src/vcpkg/commands.porthistory.cpp @@ -48,8 +48,8 @@ namespace vcpkg::Commands::PortHistory auto output = run_git_command(paths, cmd); auto commits = Util::fmap( - Strings::split(output.output, "\n"), [](const std::string& line) -> auto { - auto parts = Strings::split(line, " "); + Strings::split(output.output, '\n'), [](const std::string& line) -> auto { + auto parts = Strings::split(line, ' '); return std::make_pair(parts[0], parts[1]); }); diff --git a/toolsrc/src/vcpkg/logicexpression.cpp b/toolsrc/src/vcpkg/logicexpression.cpp index c4365194d..06d949e06 100644 --- a/toolsrc/src/vcpkg/logicexpression.cpp +++ b/toolsrc/src/vcpkg/logicexpression.cpp @@ -55,7 +55,7 @@ namespace vcpkg auto override_vars = evaluation_context.cmake_context.find("VCPKG_DEP_INFO_OVERRIDE_VARS"); if (override_vars != evaluation_context.cmake_context.end()) { - auto cmake_list = Strings::split(override_vars->second, ";"); + auto cmake_list = Strings::split(override_vars->second, ';'); for (auto& override_id : cmake_list) { if (!override_id.empty()) |
