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");