From: Joel Rosdahl Date: Sun, 16 Jul 2023 07:18:57 +0000 (+0200) Subject: refactor: Move Util::split_into_* to util X-Git-Tag: v4.9~119 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=32970d780f30dda653ebca5eebd1e24d02a79475;p=thirdparty%2Fccache.git refactor: Move Util::split_into_* to util --- diff --git a/src/Args.cpp b/src/Args.cpp index 2b05673ba..caddb46c9 100644 --- a/src/Args.cpp +++ b/src/Args.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2020-2022 Joel Rosdahl and other contributors +// Copyright (C) 2020-2023 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,8 +18,6 @@ #include "Args.hpp" -#include "Util.hpp" - #include #include #include @@ -41,7 +39,7 @@ Args Args::from_string(std::string_view command) { Args args; - for (const std::string& word : Util::split_into_strings(command, " \t\r\n")) { + for (const std::string& word : util::split_into_strings(command, " \t\r\n")) { args.push_back(word); } return args; diff --git a/src/Context.cpp b/src/Context.cpp index cdf79ea1f..98d175af8 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAVE_UNISTD_H # include @@ -58,7 +59,7 @@ Context::initialize(Args&& compiler_and_args, Logging::init(config); ignore_header_paths = util::split_path_list(config.ignore_headers_in_manifest()); - set_ignore_options(Util::split_into_strings(config.ignore_options(), " ")); + set_ignore_options(util::split_into_strings(config.ignore_options(), " ")); // Set default umask for all files created by ccache from now on (if // configured to). This is intentionally done after calling Logging::init so diff --git a/src/Depfile.cpp b/src/Depfile.cpp index c85164f18..064e2124f 100644 --- a/src/Depfile.cpp +++ b/src/Depfile.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -83,7 +84,7 @@ rewrite_source_paths(const Context& ctx, std::string_view file_content) "\n", Tokenizer::Mode::include_empty, Tokenizer::IncludeDelimiter::yes)) { - const auto tokens = Util::split_into_views(line, " \t"); + const auto tokens = util::split_into_views(line, " \t"); for (size_t i = 0; i < tokens.size(); ++i) { DEBUG_ASSERT(!line.empty()); // line.empty() -> no tokens DEBUG_ASSERT(!tokens[i].empty()); diff --git a/src/Util.cpp b/src/Util.cpp index 580de30da..af397ea01 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -91,22 +90,6 @@ find_first_ansi_csi_seq(std::string_view string) } } -template -std::vector -split_into(std::string_view string, - const char* separators, - util::Tokenizer::Mode mode, - IncludeDelimiter include_delimiter) - -{ - std::vector result; - for (const auto token : - util::Tokenizer(string, separators, mode, include_delimiter)) { - result.emplace_back(token); - } - return result; -} - std::string rewrite_stderr_to_absolute_paths(std::string_view text) { @@ -683,25 +666,6 @@ send_to_fd(const Context& ctx, std::string_view text, int fd) } } -std::vector -split_into_views(std::string_view string, - const char* separators, - util::Tokenizer::Mode mode, - IncludeDelimiter include_delimiter) -{ - return split_into( - string, separators, mode, include_delimiter); -} - -std::vector -split_into_strings(std::string_view string, - const char* separators, - util::Tokenizer::Mode mode, - IncludeDelimiter include_delimiter) -{ - return split_into(string, separators, mode, include_delimiter); -} - std::string strip_ansi_csi_seqs(std::string_view string) { diff --git a/src/Util.hpp b/src/Util.hpp index 5e8fc8ac7..5c47bf249 100644 --- a/src/Util.hpp +++ b/src/Util.hpp @@ -19,7 +19,6 @@ #pragma once #include -#include #include #include @@ -172,24 +171,6 @@ std::string_view remove_extension(std::string_view path); // `core::Error` on error. void send_to_fd(const Context& ctx, std::string_view text, int fd); -// Split `string` into tokens at any of the characters in `separators`. These -// tokens are views into `string`. `separators` must neither be the empty string -// nor a nullptr. -std::vector -split_into_views(std::string_view string, - const char* separators, - util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty, - util::Tokenizer::IncludeDelimiter include_delimiter = - util::Tokenizer::IncludeDelimiter::no); - -// Same as `split_into_views` but the tokens are copied from `string`. -std::vector split_into_strings( - std::string_view string, - const char* separators, - util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty, - util::Tokenizer::IncludeDelimiter include_delimiter = - util::Tokenizer::IncludeDelimiter::no); - // Returns a copy of string with the specified ANSI CSI sequences removed. [[nodiscard]] std::string strip_ansi_csi_seqs(std::string_view string); diff --git a/src/argprocessing.cpp b/src/argprocessing.cpp index 4651ed95f..99209fd69 100644 --- a/src/argprocessing.cpp +++ b/src/argprocessing.cpp @@ -372,7 +372,7 @@ process_option_arg(const Context& ctx, ++i; // Argument is a comma-separated list of files. - auto paths = Util::split_into_strings(args[i], ","); + auto paths = util::split_into_strings(args[i], ","); for (auto it = paths.rbegin(); it != paths.rend(); ++it) { auto file_args = Args::from_atfile(*it); if (!file_args) { diff --git a/src/ccache.cpp b/src/ccache.cpp index 45b7b1af4..8002f7ccc 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -165,7 +165,7 @@ add_prefix(const Context& ctx, Args& args, const std::string& prefix_command) } Args prefix; - for (const auto& word : Util::split_into_strings(prefix_command, " ")) { + for (const auto& word : util::split_into_strings(prefix_command, " ")) { std::string path = find_executable(ctx, word, ctx.orig_args[0]); if (path.empty()) { throw core::Fatal(FMT("{}: {}", word, strerror(errno))); diff --git a/src/core/MsvcShowIncludesOutput.cpp b/src/core/MsvcShowIncludesOutput.cpp index 311a1bcbb..dcc153985 100644 --- a/src/core/MsvcShowIncludesOutput.cpp +++ b/src/core/MsvcShowIncludesOutput.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2022 Joel Rosdahl and other contributors +// Copyright (C) 2022-2023 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -19,7 +19,6 @@ #include "MsvcShowIncludesOutput.hpp" #include -#include #include namespace core::MsvcShowIncludesOutput { @@ -34,7 +33,7 @@ get_includes(std::string_view file_content, std::string_view prefix) std::vector result; // This will split at each \r or \n, but that simply means there will be empty // "lines". - for (std::string_view line : Util::split_into_views(file_content, "\r\n")) { + for (std::string_view line : util::split_into_views(file_content, "\r\n")) { if (util::starts_with(line, prefix)) { size_t pos = prefix.size(); while (pos < line.size() && isspace(line[pos])) { diff --git a/src/hashutil.cpp b/src/hashutil.cpp index a06c787f9..9a42db9cc 100644 --- a/src/hashutil.cpp +++ b/src/hashutil.cpp @@ -491,7 +491,7 @@ hash_multicommand_output(Hash& hash, const std::string& command, const std::string& compiler) { - for (const std::string& cmd : Util::split_into_strings(command, ";")) { + for (const std::string& cmd : util::split_into_strings(command, ";")) { if (!hash_command_output(hash, cmd, compiler)) { return false; } diff --git a/src/storage/Storage.cpp b/src/storage/Storage.cpp index 7f15f9fe0..f1521fa2d 100644 --- a/src/storage/Storage.cpp +++ b/src/storage/Storage.cpp @@ -118,7 +118,7 @@ static RemoteStorageConfig parse_storage_config(const std::string_view entry) { const auto parts = - Util::split_into_views(entry, "|", util::Tokenizer::Mode::include_empty); + util::split_into_views(entry, "|", util::Tokenizer::Mode::include_empty); if (parts.empty() || parts.front().empty()) { throw core::Error( diff --git a/src/util/LockFile.cpp b/src/util/LockFile.cpp index d9184ef2e..9fb998f45 100644 --- a/src/util/LockFile.cpp +++ b/src/util/LockFile.cpp @@ -24,6 +24,7 @@ #include "fmtmacros.hpp" #include +#include #include #include #include diff --git a/src/util/path.cpp b/src/util/path.cpp index 6d9e55bd4..3e0b8bdb2 100644 --- a/src/util/path.cpp +++ b/src/util/path.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #ifdef _WIN32 const char k_dev_null_path[] = "nul:"; @@ -99,7 +100,7 @@ real_path(std::string_view path) std::vector split_path_list(std::string_view path_list) { - return Util::split_into_strings(path_list, k_path_delimiter); + return util::split_into_strings(path_list, k_path_delimiter); } std::string diff --git a/src/util/string.cpp b/src/util/string.cpp index 7f17826d7..b3a84e38a 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -25,6 +25,26 @@ #include #include +namespace { + +template +std::vector +split_into(std::string_view string, + const char* separators, + util::Tokenizer::Mode mode, + util::Tokenizer::IncludeDelimiter include_delimiter) + +{ + std::vector result; + for (const auto token : + util::Tokenizer(string, separators, mode, include_delimiter)) { + result.emplace_back(token); + } + return result; +} + +} // namespace + namespace util { std::string @@ -345,6 +365,25 @@ replace_first(const std::string_view string, return result; } +std::vector +split_into_strings(std::string_view string, + const char* separators, + util::Tokenizer::Mode mode, + util::Tokenizer::IncludeDelimiter include_delimiter) +{ + return split_into(string, separators, mode, include_delimiter); +} + +std::vector +split_into_views(std::string_view string, + const char* separators, + util::Tokenizer::Mode mode, + util::Tokenizer::IncludeDelimiter include_delimiter) +{ + return split_into( + string, separators, mode, include_delimiter); +} + std::pair> split_once(const char* string, const char split_char) { diff --git a/src/util/string.hpp b/src/util/string.hpp index 1739e9a6c..d292700c0 100644 --- a/src/util/string.hpp +++ b/src/util/string.hpp @@ -19,6 +19,7 @@ #pragma once #include +#include #include #include @@ -32,6 +33,7 @@ #include #include #include +#include namespace util { @@ -138,6 +140,25 @@ std::string replace_first(std::string_view string, std::string_view from, std::string_view to); +// Split `string` into tokens at any of the characters in `separators`. +// `separators` must neither be the empty string nor a nullptr. +std::vector split_into_strings( + std::string_view string, + const char* separators, + util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty, + util::Tokenizer::IncludeDelimiter include_delimiter = + util::Tokenizer::IncludeDelimiter::no); + +// Split `string` into tokens at any of the characters in `separators`. These +// tokens are views into `string`. `separators` must neither be the empty string +// nor a nullptr. +std::vector +split_into_views(std::string_view string, + const char* separators, + util::Tokenizer::Mode mode = util::Tokenizer::Mode::skip_empty, + util::Tokenizer::IncludeDelimiter include_delimiter = + util::Tokenizer::IncludeDelimiter::no); + // Split `string` into two parts using `split_char` as the delimiter. The second // part will be `nullopt` if there is no `split_char` in `string.` std::pair> diff --git a/unittest/test_Util.cpp b/unittest/test_Util.cpp index 6b9168a84..331482aa9 100644 --- a/unittest/test_Util.cpp +++ b/unittest/test_Util.cpp @@ -416,9 +416,6 @@ TEST_CASE("Util::remove_extension") CHECK(Util::remove_extension("/foo/bar/f.abc.txt") == "/foo/bar/f.abc"); } -// Util::split_into_strings and Util::split_into_views are tested implicitly in -// test_util_Tokenizer.cpp. - TEST_CASE("Util::to_lowercase") { CHECK(Util::to_lowercase("") == ""); diff --git a/unittest/test_util_Tokenizer.cpp b/unittest/test_util_Tokenizer.cpp index d6eeabed9..f52fc4c6d 100644 --- a/unittest/test_util_Tokenizer.cpp +++ b/unittest/test_util_Tokenizer.cpp @@ -18,6 +18,8 @@ #include "../src/Util.hpp" +#include + #include "third_party/doctest.h" #include // https://github.com/doctest/doctest/issues/618 @@ -43,7 +45,7 @@ TEST_CASE("util::Tokenizer") const std::vector& expected) const { const auto res = - Util::split_into_views(input, separators, m_mode, m_include_delimiter); + util::split_into_views(input, separators, m_mode, m_include_delimiter); REQUIRE(res.size() == expected.size()); for (int i = 0, total = expected.size(); i < total; ++i) { CHECK(res[i] == expected[i]); diff --git a/unittest/test_util_string.cpp b/unittest/test_util_string.cpp index 70a291c93..4a02bed54 100644 --- a/unittest/test_util_string.cpp +++ b/unittest/test_util_string.cpp @@ -444,6 +444,20 @@ TEST_CASE("util::replace_first") CHECK(util::replace_first("xabcyabcz", "abc", "defdef") == "xdefdefyabcz"); } +TEST_CASE("util::split_into_strings") +{ + // Edge cases are tested in test_util_Tokenizer.cpp. + CHECK(util::split_into_strings("foo bar", " ") + == std::vector{"foo", "bar"}); +} + +TEST_CASE("util::split_into_views") +{ + // Edge cases are tested in test_util_Tokenizer.cpp. + CHECK(util::split_into_views("foo bar", " ") + == std::vector{"foo", "bar"}); +} + TEST_CASE("util::split_once") { using std::make_pair;