Outline SourceLocation stringification for StringifySink to reduce binary size. Every call site formatting `absl::SourceLocation` via `StrCat`, `StrAppend`, or `Substitute` instantiates `AbslStringify` with `strings_internal::StringifySink`, expanding integer formatting and buffer appends inline across callers. Provide an out-of-line non-template `AbslStringify(strings_internal::StringifySink&, SourceLocation)` overload in `stringify_sink.cc` that delegates to the existing template implementation. PiperOrigin-RevId: 1003943520
diff --git a/absl/strings/ascii.cc b/absl/strings/ascii.cc index b5c7e19..793d4a2 100644 --- a/absl/strings/ascii.cc +++ b/absl/strings/ascii.cc
@@ -14,6 +14,7 @@ #include "absl/strings/ascii.h" +#include <algorithm> #include <climits> #include <cstddef> #include <cstring> @@ -21,6 +22,8 @@ #include "absl/base/config.h" #include "absl/base/nullability.h" +#include "absl/strings/resize_and_overwrite.h" +#include "absl/strings/string_view.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -258,11 +261,58 @@ return ascii_internal::AsciiStrCaseFold<false>(p, p, s->size()); } +std::string AsciiStrToLower(absl::string_view s) { + std::string result; + StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) { + ascii_internal::AsciiStrToLower(buf, s.data(), s.size()); + return buf_size; + }); + return result; +} + void AsciiStrToUpper(std::string* absl_nonnull s) { char* p = &(*s)[0]; return ascii_internal::AsciiStrCaseFold<true>(p, p, s->size()); } +std::string AsciiStrToUpper(absl::string_view s) { + std::string result; + StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) { + ascii_internal::AsciiStrToUpper(buf, s.data(), s.size()); + return buf_size; + }); + return result; +} + +absl::string_view StripLeadingAsciiWhitespace(absl::string_view str) { + auto it = std::find_if_not(str.begin(), str.end(), absl::ascii_isspace); + return str.substr(static_cast<size_t>(it - str.begin())); +} + +void StripLeadingAsciiWhitespace(std::string* absl_nonnull str) { + auto it = std::find_if_not(str->begin(), str->end(), absl::ascii_isspace); + str->erase(str->begin(), it); +} + +absl::string_view StripTrailingAsciiWhitespace(absl::string_view str) { + auto it = std::find_if_not(str.rbegin(), str.rend(), absl::ascii_isspace); + return str.substr(0, static_cast<size_t>(str.rend() - it)); +} + +void StripTrailingAsciiWhitespace(std::string* absl_nonnull str) { + auto it = std::find_if_not(str->rbegin(), str->rend(), absl::ascii_isspace); + str->erase(static_cast<size_t>(str->rend() - it)); +} + +absl::string_view StripAsciiWhitespace(absl::string_view str) { + return StripTrailingAsciiWhitespace(StripLeadingAsciiWhitespace(str)); +} + +void StripAsciiWhitespace(std::string* absl_nonnull str) { + StripTrailingAsciiWhitespace(str); + StripLeadingAsciiWhitespace(str); +} + void RemoveExtraAsciiWhitespace(std::string* absl_nonnull str) { auto stripped = StripAsciiWhitespace(*str);
diff --git a/absl/strings/ascii.h b/absl/strings/ascii.h index d6252d6..581184e 100644 --- a/absl/strings/ascii.h +++ b/absl/strings/ascii.h
@@ -188,14 +188,7 @@ void AsciiStrToLower(std::string* absl_nonnull s); // Creates a lowercase string from a given absl::string_view. -[[nodiscard]] inline std::string AsciiStrToLower(absl::string_view s) { - std::string result; - StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) { - ascii_internal::AsciiStrToLower(buf, s.data(), s.size()); - return buf_size; - }); - return result; -} +[[nodiscard]] std::string AsciiStrToLower(absl::string_view s); // Creates a lowercase string from a given std::string&&. // @@ -219,14 +212,7 @@ void AsciiStrToUpper(std::string* absl_nonnull s); // Creates an uppercase string from a given absl::string_view. -[[nodiscard]] inline std::string AsciiStrToUpper(absl::string_view s) { - std::string result; - StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) { - ascii_internal::AsciiStrToUpper(buf, s.data(), s.size()); - return buf_size; - }); - return result; -} +[[nodiscard]] std::string AsciiStrToUpper(absl::string_view s); // Creates an uppercase string from a given std::string&&. // @@ -240,44 +226,27 @@ // Returns absl::string_view with whitespace stripped from the beginning of the // given string_view. -[[nodiscard]] inline absl::string_view StripLeadingAsciiWhitespace( - absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) { - auto it = std::find_if_not(str.begin(), str.end(), absl::ascii_isspace); - return str.substr(static_cast<size_t>(it - str.begin())); -} +[[nodiscard]] absl::string_view StripLeadingAsciiWhitespace( + absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND); // Strips in place whitespace from the beginning of the given string. -inline void StripLeadingAsciiWhitespace(std::string* absl_nonnull str) { - auto it = std::find_if_not(str->begin(), str->end(), absl::ascii_isspace); - str->erase(str->begin(), it); -} +void StripLeadingAsciiWhitespace(std::string* absl_nonnull str); // Returns absl::string_view with whitespace stripped from the end of the given // string_view. -[[nodiscard]] inline absl::string_view StripTrailingAsciiWhitespace( - absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) { - auto it = std::find_if_not(str.rbegin(), str.rend(), absl::ascii_isspace); - return str.substr(0, static_cast<size_t>(str.rend() - it)); -} +[[nodiscard]] absl::string_view StripTrailingAsciiWhitespace( + absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND); // Strips in place whitespace from the end of the given string -inline void StripTrailingAsciiWhitespace(std::string* absl_nonnull str) { - auto it = std::find_if_not(str->rbegin(), str->rend(), absl::ascii_isspace); - str->erase(static_cast<size_t>(str->rend() - it)); -} +void StripTrailingAsciiWhitespace(std::string* absl_nonnull str); // Returns absl::string_view with whitespace stripped from both ends of the // given string_view. -[[nodiscard]] inline absl::string_view StripAsciiWhitespace( - absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) { - return StripTrailingAsciiWhitespace(StripLeadingAsciiWhitespace(str)); -} +[[nodiscard]] absl::string_view StripAsciiWhitespace( + absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND); // Strips in place whitespace from both ends of the given string -inline void StripAsciiWhitespace(std::string* absl_nonnull str) { - StripTrailingAsciiWhitespace(str); - StripLeadingAsciiWhitespace(str); -} +void StripAsciiWhitespace(std::string* absl_nonnull str); // Removes leading, trailing, and consecutive internal whitespace. void RemoveExtraAsciiWhitespace(std::string* absl_nonnull str);
diff --git a/absl/strings/internal/ostringstream.cc b/absl/strings/internal/ostringstream.cc index 5ac41cc..e848c15 100644 --- a/absl/strings/internal/ostringstream.cc +++ b/absl/strings/internal/ostringstream.cc
@@ -17,7 +17,10 @@ #include <cassert> #include <cstddef> #include <ios> +#include <ostream> #include <streambuf> +#include <string> +#include <utility> #include "absl/base/config.h" @@ -25,6 +28,26 @@ ABSL_NAMESPACE_BEGIN namespace strings_internal { +OStringStream::OStringStream(std::string* str) + : std::ostream(&buf_), buf_(str) {} + +OStringStream::OStringStream(OStringStream&& that) + : std::ostream(std::move(static_cast<std::ostream&>(that))), + buf_(that.buf_) { + rdbuf(&buf_); +} + +OStringStream& OStringStream::operator=(OStringStream&& that) { + std::ostream::operator=(std::move(static_cast<std::ostream&>(that))); + buf_ = that.buf_; + rdbuf(&buf_); + return *this; +} + +OStringStream::~OStringStream() = default; + +OStringStream::Streambuf::~Streambuf() = default; + OStringStream::Streambuf::int_type OStringStream::Streambuf::overflow(int c) { assert(str_); if (!std::streambuf::traits_type::eq_int_type(
diff --git a/absl/strings/internal/ostringstream.h b/absl/strings/internal/ostringstream.h index c0e237d..943b369 100644 --- a/absl/strings/internal/ostringstream.h +++ b/absl/strings/internal/ostringstream.h
@@ -69,19 +69,10 @@ // // The destructor of OStringStream doesn't use the std::string. It's OK to // destroy the std::string before the stream. - explicit OStringStream(std::string* str) - : std::ostream(&buf_), buf_(str) {} - OStringStream(OStringStream&& that) - : std::ostream(std::move(static_cast<std::ostream&>(that))), - buf_(that.buf_) { - rdbuf(&buf_); - } - OStringStream& operator=(OStringStream&& that) { - std::ostream::operator=(std::move(static_cast<std::ostream&>(that))); - buf_ = that.buf_; - rdbuf(&buf_); - return *this; - } + explicit OStringStream(std::string* str); + OStringStream(OStringStream&& that); + OStringStream& operator=(OStringStream&& that); + ~OStringStream() override; std::string* str() { return buf_.str(); } const std::string* str() const { return buf_.str(); } @@ -93,6 +84,7 @@ explicit Streambuf(std::string* str) : str_(str) {} Streambuf(const Streambuf&) = default; Streambuf& operator=(const Streambuf&) = default; + ~Streambuf() override; std::string* str() { return str_; } const std::string* str() const { return str_; }
diff --git a/absl/strings/internal/stringify_sink.cc b/absl/strings/internal/stringify_sink.cc index c9f8258..f0c3cc2 100644 --- a/absl/strings/internal/stringify_sink.cc +++ b/absl/strings/internal/stringify_sink.cc
@@ -18,6 +18,7 @@ #include "absl/base/config.h" #include "absl/strings/string_view.h" +#include "absl/types/source_location.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -30,5 +31,10 @@ } } // namespace strings_internal + +void AbslStringify(strings_internal::StringifySink& sink, SourceLocation l) { + AbslStringify<strings_internal::StringifySink>(sink, l); +} + ABSL_NAMESPACE_END } // namespace absl
diff --git a/absl/strings/internal/stringify_sink.h b/absl/strings/internal/stringify_sink.h index e4e5f9e..7b8c456 100644 --- a/absl/strings/internal/stringify_sink.h +++ b/absl/strings/internal/stringify_sink.h
@@ -56,6 +56,8 @@ } // namespace strings_internal +void AbslStringify(strings_internal::StringifySink& sink, SourceLocation l); + template <typename Sink> void AbslStringify(Sink& sink, SourceLocation l) { sink.Append(l.file_name());