aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorBilly O'Neal <bion@microsoft.com>2020-05-19 15:05:53 -0700
committerGitHub <noreply@github.com>2020-05-19 15:05:53 -0700
commit0116b86e38517d9f430e150feb19914915b734da (patch)
treef6bedf9495cb807a9f9d5f75daa0a76bfd7d1ae6 /toolsrc/src
parent9a0652b87002b671a3dd90038461f912d368a398 (diff)
downloadvcpkg-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.cpp20
-rw-r--r--toolsrc/src/vcpkg.cpp2
-rw-r--r--toolsrc/src/vcpkg/base/files.cpp4
-rw-r--r--toolsrc/src/vcpkg/base/strings.cpp66
-rw-r--r--toolsrc/src/vcpkg/base/system.process.cpp2
-rw-r--r--toolsrc/src/vcpkg/build.cpp2
-rw-r--r--toolsrc/src/vcpkg/cmakevars.cpp4
-rw-r--r--toolsrc/src/vcpkg/commands.autocomplete.cpp2
-rw-r--r--toolsrc/src/vcpkg/commands.ci.cpp2
-rw-r--r--toolsrc/src/vcpkg/commands.porthistory.cpp4
-rw-r--r--toolsrc/src/vcpkg/logicexpression.cpp2
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())