Replace rtc::ToString() implementation with StrCat for most cases Bug: None Change-Id: I23e76cbd531cd5ea2e10ea16763cbce5491c8f8d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364260 Commit-Queue: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#43125}
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index fc2fc09..f157308 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn
@@ -601,6 +601,7 @@ ":macromagic", ":safe_minmax", "../api:array_view", + "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings:string_view", ] }
diff --git a/rtc_base/DEPS b/rtc_base/DEPS index b5aacb1..3e27cfa 100644 --- a/rtc_base/DEPS +++ b/rtc_base/DEPS
@@ -10,6 +10,9 @@ "+absl/strings/has_absl_stringify.h", "+absl/strings/str_cat.h", ], + "string_encode.h": [ + "+absl/strings/str_cat.h" + ], "protobuf_utils.h": [ "+third_party/protobuf", ],
diff --git a/rtc_base/logging.h b/rtc_base/logging.h index acff13b..208e8b9 100644 --- a/rtc_base/logging.h +++ b/rtc_base/logging.h
@@ -284,6 +284,7 @@ inline Val<LogArgType::kDouble, double> MakeVal(double x) { return {x}; } + inline Val<LogArgType::kLongDouble, long double> MakeVal(long double x) { return {x}; }
diff --git a/rtc_base/string_encode.cc b/rtc_base/string_encode.cc index 434d1e6..e5fd061 100644 --- a/rtc_base/string_encode.cc +++ b/rtc_base/string_encode.cc
@@ -187,88 +187,19 @@ return fields; } -std::string ToString(const bool b) { +template <> +std::string ToString(bool b) { return b ? "true" : "false"; } -std::string ToString(absl::string_view s) { - return std::string(s); -} - -std::string ToString(const char* s) { - return std::string(s); -} - -std::string ToString(const short s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%hd", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const unsigned short s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%hu", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const int s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%d", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const unsigned int s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%u", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const long int s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%ld", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const unsigned long int s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%lu", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const long long int s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%lld", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} -std::string ToString(const unsigned long long int s) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%llu", s); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} - -std::string ToString(const double d) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%g", d); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} - -std::string ToString(const long double d) { +template <> +std::string ToString(long double d) { char buf[32]; const int len = std::snprintf(&buf[0], arraysize(buf), "%Lg", d); RTC_DCHECK_LE(len, arraysize(buf)); return std::string(&buf[0], len); } -std::string ToString(const void* const p) { - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%p", p); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} - bool FromString(absl::string_view s, bool* b) { if (s == "false") { *b = false;
diff --git a/rtc_base/string_encode.h b/rtc_base/string_encode.h index a28559d..836f236 100644 --- a/rtc_base/string_encode.h +++ b/rtc_base/string_encode.h
@@ -18,6 +18,7 @@ #include <type_traits> #include <vector> +#include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "api/array_view.h" #include "rtc_base/checks.h" @@ -62,28 +63,32 @@ std::string* token, std::string* rest); -// Convert arbitrary values to/from a string. -// TODO(jonasolsson): Remove these when absl::StrCat becomes available. +template <typename T, + typename std::enable_if< + !std::is_pointer<T>::value || + std::is_convertible<T, const char*>::value>::type* = nullptr> +std::string ToString(T value) { + return {absl::StrCat(value)}; +} + +// Versions that behave differently from StrCat +template <> std::string ToString(bool b); -std::string ToString(absl::string_view s); -// The const char* overload is needed for correct overload resolution because of -// the const void* version of ToString() below. -std::string ToString(const char* s); - -std::string ToString(short s); -std::string ToString(unsigned short s); -std::string ToString(int s); -std::string ToString(unsigned int s); -std::string ToString(long int s); -std::string ToString(unsigned long int s); -std::string ToString(long long int s); -std::string ToString(unsigned long long int s); - -std::string ToString(double t); +// Versions not supported by StrCat: +template <> std::string ToString(long double t); -std::string ToString(const void* p); +template <typename T, + typename std::enable_if< + std::is_pointer<T>::value && + !std::is_convertible<T, const char*>::value>::type* = nullptr> +std::string ToString(T p) { + char buf[32]; + const int len = std::snprintf(&buf[0], std::size(buf), "%p", p); + RTC_DCHECK_LE(len, std::size(buf)); + return std::string(&buf[0], len); +} template <typename T, typename std::enable_if<std::is_arithmetic<T>::value &&
diff --git a/rtc_base/string_encode_unittest.cc b/rtc_base/string_encode_unittest.cc index 94e6b24..93453c3 100644 --- a/rtc_base/string_encode_unittest.cc +++ b/rtc_base/string_encode_unittest.cc
@@ -263,6 +263,9 @@ const char* c = "message"; EXPECT_EQ(ToString(c), c); EXPECT_EQ(ToString(std::string(c)), c); + char nonconst_c[] = "message"; + EXPECT_EQ(ToString(nonconst_c), c); + EXPECT_EQ(ToString(&nonconst_c[0]), c); EXPECT_EQ(ToString(short{-123}), "-123"); EXPECT_EQ(ToString((unsigned short)123), "123");