Commit 6b8ebb35 by Abseil Team Committed by Copybara-Service

Enable AsciiStrToLower and AsciiStrToUpper overloads for rvalue references.

PiperOrigin-RevId: 657719871
Change-Id: If0f16b1d8cfae79f31427a804a5b838599154895
parent 983652e4
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#include <algorithm> #include <algorithm>
#include <cstddef> #include <cstddef>
#include <string> #include <string>
#include <utility>
#include "absl/base/attributes.h" #include "absl/base/attributes.h"
#include "absl/base/config.h" #include "absl/base/config.h"
...@@ -184,6 +185,16 @@ ABSL_MUST_USE_RESULT inline std::string AsciiStrToLower(absl::string_view s) { ...@@ -184,6 +185,16 @@ ABSL_MUST_USE_RESULT inline std::string AsciiStrToLower(absl::string_view s) {
return result; return result;
} }
// Creates a lowercase string from a given std::string&&.
//
// (Template is used to lower priority of this overload.)
template <int&... DoNotSpecify>
ABSL_MUST_USE_RESULT inline std::string AsciiStrToLower(std::string&& s) {
std::string result = std::move(s);
absl::AsciiStrToLower(&result);
return result;
}
// ascii_toupper() // ascii_toupper()
// //
// Returns the ASCII character, converting to upper-case if lower-case is // Returns the ASCII character, converting to upper-case if lower-case is
...@@ -203,6 +214,16 @@ ABSL_MUST_USE_RESULT inline std::string AsciiStrToUpper(absl::string_view s) { ...@@ -203,6 +214,16 @@ ABSL_MUST_USE_RESULT inline std::string AsciiStrToUpper(absl::string_view s) {
return result; return result;
} }
// Creates an uppercase string from a given std::string&&.
//
// (Template is used to lower priority of this overload.)
template <int&... DoNotSpecify>
ABSL_MUST_USE_RESULT inline std::string AsciiStrToUpper(std::string&& s) {
std::string result = std::move(s);
absl::AsciiStrToUpper(&result);
return result;
}
// Returns absl::string_view with whitespace stripped from the beginning of the // Returns absl::string_view with whitespace stripped from the beginning of the
// given string_view. // given string_view.
ABSL_MUST_USE_RESULT inline absl::string_view StripLeadingAsciiWhitespace( ABSL_MUST_USE_RESULT inline absl::string_view StripLeadingAsciiWhitespace(
......
...@@ -129,4 +129,32 @@ BENCHMARK(BM_StrToUpper) ...@@ -129,4 +129,32 @@ BENCHMARK(BM_StrToUpper)
->RangeMultiplier(2) ->RangeMultiplier(2)
->Range(64, 1 << 26); ->Range(64, 1 << 26);
static void BM_StrToUpperFromRvalref(benchmark::State& state) {
const size_t size = static_cast<size_t>(state.range(0));
std::string s(size, 'X');
for (auto _ : state) {
benchmark::DoNotOptimize(s);
std::string res = absl::AsciiStrToUpper(std::string(s));
benchmark::DoNotOptimize(res);
}
}
BENCHMARK(BM_StrToUpperFromRvalref)
->DenseRange(0, 32)
->RangeMultiplier(2)
->Range(64, 1 << 26);
static void BM_StrToLowerFromRvalref(benchmark::State& state) {
const size_t size = static_cast<size_t>(state.range(0));
std::string s(size, 'x');
for (auto _ : state) {
benchmark::DoNotOptimize(s);
std::string res = absl::AsciiStrToLower(std::string(s));
benchmark::DoNotOptimize(res);
}
}
BENCHMARK(BM_StrToLowerFromRvalref)
->DenseRange(0, 32)
->RangeMultiplier(2)
->Range(64, 1 << 26);
} // namespace } // namespace
...@@ -192,11 +192,13 @@ TEST(AsciiStrTo, Lower) { ...@@ -192,11 +192,13 @@ TEST(AsciiStrTo, Lower) {
const absl::string_view sp(str2); const absl::string_view sp(str2);
const std::string long_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ1!a"); const std::string long_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ1!a");
std::string mutable_str("_`?@[{AMNOPQRSTUVWXYZ"); std::string mutable_str("_`?@[{AMNOPQRSTUVWXYZ");
auto fun = []() -> std::string { return "PQRSTU"; };
EXPECT_EQ("abcdef", absl::AsciiStrToLower(buf)); EXPECT_EQ("abcdef", absl::AsciiStrToLower(buf));
EXPECT_EQ("ghijkl", absl::AsciiStrToLower(str)); EXPECT_EQ("ghijkl", absl::AsciiStrToLower(str));
EXPECT_EQ("mnopqr", absl::AsciiStrToLower(sp)); EXPECT_EQ("mnopqr", absl::AsciiStrToLower(sp));
EXPECT_EQ("abcdefghijklmnopqrstuvwxyz1!a", absl::AsciiStrToLower(long_str)); EXPECT_EQ("abcdefghijklmnopqrstuvwxyz1!a", absl::AsciiStrToLower(long_str));
EXPECT_EQ("pqrstu", absl::AsciiStrToLower(fun()));
absl::AsciiStrToLower(&mutable_str); absl::AsciiStrToLower(&mutable_str);
EXPECT_EQ("_`?@[{amnopqrstuvwxyz", mutable_str); EXPECT_EQ("_`?@[{amnopqrstuvwxyz", mutable_str);
...@@ -213,11 +215,13 @@ TEST(AsciiStrTo, Upper) { ...@@ -213,11 +215,13 @@ TEST(AsciiStrTo, Upper) {
const std::string str2("_`?@[{amnopqrstuvwxyz"); const std::string str2("_`?@[{amnopqrstuvwxyz");
const absl::string_view sp(str2); const absl::string_view sp(str2);
const std::string long_str("abcdefghijklmnopqrstuvwxyz1!A"); const std::string long_str("abcdefghijklmnopqrstuvwxyz1!A");
auto fun = []() -> std::string { return "pqrstu"; };
EXPECT_EQ("ABCDEF", absl::AsciiStrToUpper(buf)); EXPECT_EQ("ABCDEF", absl::AsciiStrToUpper(buf));
EXPECT_EQ("GHIJKL", absl::AsciiStrToUpper(str)); EXPECT_EQ("GHIJKL", absl::AsciiStrToUpper(str));
EXPECT_EQ("_`?@[{AMNOPQRSTUVWXYZ", absl::AsciiStrToUpper(sp)); EXPECT_EQ("_`?@[{AMNOPQRSTUVWXYZ", absl::AsciiStrToUpper(sp));
EXPECT_EQ("ABCDEFGHIJKLMNOPQRSTUVWXYZ1!A", absl::AsciiStrToUpper(long_str)); EXPECT_EQ("ABCDEFGHIJKLMNOPQRSTUVWXYZ1!A", absl::AsciiStrToUpper(long_str));
EXPECT_EQ("PQRSTU", absl::AsciiStrToUpper(fun()));
char mutable_buf[] = "Mutable"; char mutable_buf[] = "Mutable";
std::transform(mutable_buf, mutable_buf + strlen(mutable_buf), std::transform(mutable_buf, mutable_buf + strlen(mutable_buf),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment