From 762b70ba9dab146f86a39b58ae9c5b0d2013bad5 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 3 Apr 2023 18:50:36 -0700 Subject: [PATCH] Better string split implementation --- native/src/base/misc.cpp | 14 +++++++------- native/src/base/misc.hpp | 4 ++-- native/src/core/bootstages.cpp | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/native/src/base/misc.cpp b/native/src/base/misc.cpp index cdd355e4a..06289b324 100644 --- a/native/src/base/misc.cpp +++ b/native/src/base/misc.cpp @@ -217,14 +217,14 @@ string &replace_all(string &str, string_view from, string_view to) { return str; } -template -static auto split_impl(T s, T delims) { - vector> result; +template +static auto split_impl(string_view s, string_view delims) { + vector result; size_t base = 0; size_t found; while (true) { found = s.find_first_of(delims, base); - result.push_back(s.substr(base, found - base)); + result.emplace_back(s.substr(base, found - base)); if (found == string::npos) break; base = found + 1; @@ -232,11 +232,11 @@ static auto split_impl(T s, T delims) { return result; } -vector split(const string &s, const string &delims) { - return split_impl(s, delims); +vector split(string_view s, string_view delims) { + return split_impl(s, delims); } -vector split_ro(string_view s, string_view delims) { +vector split_view(string_view s, string_view delims) { return split_impl(s, delims); } diff --git a/native/src/base/misc.hpp b/native/src/base/misc.hpp index 824109a90..f4e16f6f7 100644 --- a/native/src/base/misc.hpp +++ b/native/src/base/misc.hpp @@ -163,8 +163,8 @@ int switch_mnt_ns(int pid); std::mt19937_64 &get_rand(const void *seed_buf = nullptr); int gen_rand_str(char *buf, int len, bool varlen = true); std::string &replace_all(std::string &str, std::string_view from, std::string_view to); -std::vector split(const std::string &s, const std::string &delims); -std::vector split_ro(std::string_view, std::string_view delims); +std::vector split(std::string_view s, std::string_view delims); +std::vector split_view(std::string_view, std::string_view delims); // Similar to vsnprintf, but the return value is the written number of bytes int vssprintf(char *dest, size_t size, const char *fmt, va_list ap); diff --git a/native/src/core/bootstages.cpp b/native/src/core/bootstages.cpp index 1386581ad..b60742eb6 100644 --- a/native/src/core/bootstages.cpp +++ b/native/src/core/bootstages.cpp @@ -71,7 +71,7 @@ static void mount_mirrors() { bool mounted = false; for (const auto &info: self_mount_info) { if (info.root == "/" && info.device == preinit_dev) { - auto flags = split_ro(info.fs_option, ","); + auto flags = split_view(info.fs_option, ","); auto rw = std::any_of(flags.begin(), flags.end(), [](const auto &flag) { return flag == "rw"sv; }); @@ -137,7 +137,7 @@ string find_preinit_device() { continue; if (info.type != "ext4" && info.type != "f2fs") continue; - auto flags = split_ro(info.fs_option, ","); + auto flags = split_view(info.fs_option, ","); auto rw = std::any_of(flags.begin(), flags.end(), [](const auto &flag) { return flag == "rw"sv; });