diff options
author | Abseil Team <absl-team@google.com> | 2022-09-30 12:11:27 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-09-30 12:12:26 -0700 |
commit | 7f3c0d781134d25b24e0b55346482a2d366bf59b (patch) | |
tree | 922945db62ad94b4aaad106e88454e196a9c1f16 /absl/strings/str_cat.h | |
parent | e8304a5c62576cdad9d9265449ab5575115fd4f2 (diff) | |
download | abseil-7f3c0d781134d25b24e0b55346482a2d366bf59b.tar.gz abseil-7f3c0d781134d25b24e0b55346482a2d366bf59b.tar.bz2 abseil-7f3c0d781134d25b24e0b55346482a2d366bf59b.zip |
Allows absl::StrCat to accept types that implement AbslStringify()
PiperOrigin-RevId: 478050535
Change-Id: I8e4a4b01aceb8d712476101633eac0ce8647823a
Diffstat (limited to 'absl/strings/str_cat.h')
-rw-r--r-- | absl/strings/str_cat.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/absl/strings/str_cat.h b/absl/strings/str_cat.h index a94bc5df..05728ab5 100644 --- a/absl/strings/str_cat.h +++ b/absl/strings/str_cat.h @@ -57,6 +57,7 @@ #include <cstdint> #include <string> #include <type_traits> +#include <utility> #include <vector> #include "absl/base/port.h" @@ -76,6 +77,27 @@ struct AlphaNumBuffer { size_t size; }; +class StringifySink { + public: + void Append(size_t count, char ch); + + void Append(string_view v); + + bool PutPaddedString(string_view v, int width, int precision, bool left); + + template <typename T> + friend string_view ExtractStringification(StringifySink& sink, const T& v); + + private: + std::string buffer_; +}; + +template <typename T> +string_view ExtractStringification(StringifySink& sink, const T& v) { + AbslStringify(sink, v); + return sink.buffer_; +} + } // namespace strings_internal // Enum that specifies the number of significant digits to return in a `Hex` or @@ -208,6 +230,15 @@ struct Dec { // `StrAppend()`, providing efficient conversion of numeric, boolean, and // hexadecimal values (through the `Hex` type) into strings. +template <typename T, typename = void> +struct HasAbslStringify : std::false_type {}; + +template <typename T> +struct HasAbslStringify<T, std::enable_if_t<std::is_void<decltype(AbslStringify( + std::declval<strings_internal::StringifySink&>(), + std::declval<const T&>()))>::value>> + : std::true_type {}; + class AlphaNum { public: // No bool ctor -- bools convert to an integral type. @@ -255,6 +286,13 @@ class AlphaNum { : piece_(NullSafeStringView(c_str)) {} // NOLINT(runtime/explicit) AlphaNum(absl::string_view pc) : piece_(pc) {} // NOLINT(runtime/explicit) + template <typename T, typename = typename std::enable_if< + HasAbslStringify<T>::value>::type> + AlphaNum( // NOLINT(runtime/explicit) + const T& v, // NOLINT(runtime/explicit) + strings_internal::StringifySink&& sink = {}) // NOLINT(runtime/explicit) + : piece_(strings_internal::ExtractStringification(sink, v)) {} + template <typename Allocator> AlphaNum( // NOLINT(runtime/explicit) const std::basic_string<char, std::char_traits<char>, Allocator>& str) |