From c407aadbb84e9621a277bc1b8304867948305836 Mon Sep 17 00:00:00 2001 From: tqcq <99722391+tqcq@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:14:38 +0800 Subject: [PATCH] fix string trim --- tile/base/slice.h | 22 ++++++++++++++++++++++ tile/base/string.cc | 18 ------------------ tile/base/string.h | 34 +++++++++++++++++++++++++++------- tile/base/string_test.cc | 9 +++++++++ 4 files changed, 58 insertions(+), 25 deletions(-) diff --git a/tile/base/slice.h b/tile/base/slice.h index 8ec1435..6924750 100644 --- a/tile/base/slice.h +++ b/tile/base/slice.h @@ -225,6 +225,28 @@ operator+(const Slice &lhs, const Slice &rhs) return lhs.ToString() + rhs.ToString(); } +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); + +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); + +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); + +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); + +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); + +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); +static_assert(std::is_constructible::value, "Can't Build Sliece"); + }// namespace tile namespace std { diff --git a/tile/base/string.cc b/tile/base/string.cc index deb2c90..ce8c8b9 100644 --- a/tile/base/string.cc +++ b/tile/base/string.cc @@ -121,24 +121,6 @@ Split(Slice s, Slice delim, bool keep_empty, std::size_t max_split_parts) return splited; } -Slice -TrimLeft(Slice s, Slice cutset) -{ - return TrimLeft(s, [&cutset](char c) { return cutset.find(Slice(&c, 1)) != Slice::npos; }); -} - -Slice -TrimRight(Slice s, Slice cutset) -{ - return TrimRight(s, [&cutset](char c) { return cutset.find(Slice(&c, 1)) != Slice::npos; }); -} - -Slice -Trim(Slice s, Slice cutset) -{ - return Trim(s, [&cutset](char c) { return cutset.find(Slice(&c, 1)) != Slice::npos; }); -} - template void JoinImpl(const T &parts, Slice delim, std::string *result) diff --git a/tile/base/string.h b/tile/base/string.h index 45c865b..e75ed68 100644 --- a/tile/base/string.h +++ b/tile/base/string.h @@ -39,12 +39,8 @@ bool EndsWithIgnoreCase(Slice s, Slice prefix); void Replace(Slice from, Slice to, std::string *str, std::size_t count = std::numeric_limits::max()); std::string Replace(Slice str, Slice from, Slice to, std::size_t count = std::numeric_limits::max()); -Slice TrimLeft(Slice s, Slice cutset); -Slice TrimRight(Slice s, Slice cutset); -Slice Trim(Slice s, Slice cutset); - template -Slice +enable_if_t::value, Slice> TrimLeft(Slice s, Pred pred = isspace) { while (!s.empty() && pred(s[0])) { s.RemovePrefix(1); } @@ -52,7 +48,7 @@ TrimLeft(Slice s, Pred pred = isspace) } template -Slice +enable_if_t::value, Slice> TrimRight(Slice s, Pred pred = isspace) { while (!s.empty() && pred(s[s.size() - 1])) { s.RemoveSuffix(1); } @@ -60,12 +56,36 @@ TrimRight(Slice s, Pred pred = isspace) } template -Slice +enable_if_t::value, Slice> Trim(Slice s, Pred pred = isspace) { return TrimRight(TrimLeft(s, pred), pred); } +template +enable_if_t::value, Slice> +TrimLeft(Slice s, T slice_like) +{ + Slice cutset(slice_like); + return TrimLeft(s, [&cutset](char c) { return cutset.find(c) != Slice::npos; }); +} + +template +enable_if_t::value, Slice> +TrimRight(Slice s, T slice_like) +{ + Slice cutset(slice_like); + return TrimRight(s, [&cutset](char c) { return cutset.find(c) != Slice::npos; }); +} + +template +enable_if_t::value, Slice> +Trim(Slice s, T slice_like) +{ + Slice cutset(slice_like); + return Trim(s, [&cutset](char c) { return cutset.find(c) != Slice::npos; }); +} + std::vector Split(Slice s, char delim, bool keep_empty = false, diff --git a/tile/base/string_test.cc b/tile/base/string_test.cc index 79697a9..ea204c8 100644 --- a/tile/base/string_test.cc +++ b/tile/base/string_test.cc @@ -184,6 +184,15 @@ TEST(String, Trim) ASSERT_EQ("a a", Trim(" a a ")); } +TEST(String, TrimByCustset) +{ + static_assert(std::is_constructible::value, ""); + static_assert(!std::is_constructible::value, ""); + ASSERT_EQ(" ", Trim("abcd abcd", "abcd")); + ASSERT_EQ("abcd abc", Trim("abcd abcd", "d")); + ASSERT_EQ("abcd abcd ", Trim("abcd abcd ", "d")); +} + TEST(String, Split1) { auto splited = Split("/a/b/c/d/e/f///g", '/');