Move cold inline Substitute helpers out of the header to reduce code size. Moving integer formatting constructors and multi-argument SubstituteAndAppend overloads from the header to the implementation file prevents them from being duplicated across thousands of formatting call sites. PiperOrigin-RevId: 1005559909
diff --git a/absl/strings/substitute.cc b/absl/strings/substitute.cc index 244c8a5..4ee69a5 100644 --- a/absl/strings/substitute.cc +++ b/absl/strings/substitute.cc
@@ -197,5 +197,106 @@ } } // namespace substitute_internal + +namespace substitute_internal { +Arg::Arg(const char* absl_nullable value) + : piece_(absl::NullSafeStringView(value)) {} +} // namespace substitute_internal + +namespace substitute_internal { +Arg::Arg(char value) { // NOLINT(google-explicit-constructor) + scratch_[0] = value; + piece_ = absl::string_view(scratch_, 1); +} +} // namespace substitute_internal + +namespace substitute_internal { +Arg::Arg(unsigned short value) + : piece_(scratch_, static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} +} // namespace substitute_internal + +namespace substitute_internal { +Arg::Arg(unsigned int value) + : piece_(scratch_, static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} +} // namespace substitute_internal + +namespace substitute_internal { +Arg::Arg(float value) + : piece_(scratch_, numbers_internal::SixDigitsToBuffer(value, scratch_)) {} +} // namespace substitute_internal + +void SubstituteAndAppend(std::string* absl_nonnull output, + absl::string_view format) { + substitute_internal::SubstituteAndAppendArray(output, format, nullptr, 0); +} + +void SubstituteAndAppend(std::string* absl_nonnull output, + absl::string_view format, + const substitute_internal::Arg& a0, + const substitute_internal::Arg& a1, + const substitute_internal::Arg& a2, + const substitute_internal::Arg& a3, + const substitute_internal::Arg& a4) { + const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), + a3.piece(), a4.piece()}; + substitute_internal::SubstituteAndAppendArray(output, format, args, + std::size(args)); +} + +void SubstituteAndAppend( + std::string* absl_nonnull output, absl::string_view format, + const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, + const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, + const substitute_internal::Arg& a4, const substitute_internal::Arg& a5) { + const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), + a3.piece(), a4.piece(), a5.piece()}; + substitute_internal::SubstituteAndAppendArray(output, format, args, + std::size(args)); +} + +void SubstituteAndAppend( + std::string* absl_nonnull output, absl::string_view format, + const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, + const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, + const substitute_internal::Arg& a4, const substitute_internal::Arg& a5, + const substitute_internal::Arg& a6) { + const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), + a3.piece(), a4.piece(), a5.piece(), + a6.piece()}; + substitute_internal::SubstituteAndAppendArray(output, format, args, + std::size(args)); +} + +void SubstituteAndAppend( + std::string* absl_nonnull output, absl::string_view format, + const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, + const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, + const substitute_internal::Arg& a4, const substitute_internal::Arg& a5, + const substitute_internal::Arg& a6, const substitute_internal::Arg& a7) { + const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), + a3.piece(), a4.piece(), a5.piece(), + a6.piece(), a7.piece()}; + substitute_internal::SubstituteAndAppendArray(output, format, args, + std::size(args)); +} + +void SubstituteAndAppend( + std::string* absl_nonnull output, absl::string_view format, + const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, + const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, + const substitute_internal::Arg& a4, const substitute_internal::Arg& a5, + const substitute_internal::Arg& a6, const substitute_internal::Arg& a7, + const substitute_internal::Arg& a8, const substitute_internal::Arg& a9) { + const absl::string_view args[] = { + a0.piece(), a1.piece(), a2.piece(), a3.piece(), a4.piece(), + a5.piece(), a6.piece(), a7.piece(), a8.piece(), a9.piece()}; + substitute_internal::SubstituteAndAppendArray(output, format, args, + std::size(args)); +} + ABSL_NAMESPACE_END } // namespace absl
diff --git a/absl/strings/substitute.h b/absl/strings/substitute.h index 6c62af6..2cff27c 100644 --- a/absl/strings/substitute.h +++ b/absl/strings/substitute.h
@@ -109,8 +109,7 @@ // Overloads for string-y things // // Explicitly overload `const char*` so the compiler doesn't cast to `bool`. - Arg(const char* absl_nullable value) // NOLINT(google-explicit-constructor) - : piece_(absl::NullSafeStringView(value)) {} + Arg(const char* absl_nullable value); // NOLINT(google-explicit-constructor) template <typename Allocator> Arg( // NOLINT const std::basic_string<char, std::char_traits<char>, Allocator>& @@ -126,30 +125,19 @@ // probably using them as 8-bit integers and would probably prefer an integer // representation. However, we can't really know, so we make the caller decide // what to do. - Arg(char value) { // NOLINT(google-explicit-constructor) - scratch_[0] = value; - piece_ = absl::string_view(scratch_, 1); - } + Arg(char value); Arg(short value) // NOLINT(*) : piece_(scratch_, static_cast<size_t>( numbers_internal::FastIntToBuffer(value, scratch_) - scratch_)) {} - Arg(unsigned short value) // NOLINT(*) - : piece_(scratch_, - static_cast<size_t>( - numbers_internal::FastIntToBuffer(value, scratch_) - - scratch_)) {} + Arg(unsigned short value); // NOLINT(*) Arg(int value) // NOLINT(google-explicit-constructor) : piece_(scratch_, static_cast<size_t>( numbers_internal::FastIntToBuffer(value, scratch_) - scratch_)) {} - Arg(unsigned int value) // NOLINT(google-explicit-constructor) - : piece_(scratch_, - static_cast<size_t>( - numbers_internal::FastIntToBuffer(value, scratch_) - - scratch_)) {} + Arg(unsigned int value); // NOLINT(google-explicit-constructor) Arg(long value) // NOLINT(*) : piece_(scratch_, static_cast<size_t>( @@ -170,9 +158,7 @@ static_cast<size_t>( numbers_internal::FastIntToBuffer(value, scratch_) - scratch_)) {} - Arg(float value) // NOLINT(google-explicit-constructor) - : piece_(scratch_, numbers_internal::SixDigitsToBuffer(value, scratch_)) { - } + Arg(float value); // NOLINT(google-explicit-constructor) Arg(double value) // NOLINT(google-explicit-constructor) : piece_(scratch_, numbers_internal::SixDigitsToBuffer(value, scratch_)) { } @@ -276,10 +262,8 @@ // absl::SubstituteAndAppend(boilerplate, format, args...); // } // -inline void SubstituteAndAppend(std::string* absl_nonnull output, - absl::string_view format) { - substitute_internal::SubstituteAndAppendArray(output, format, nullptr, 0); -} +void SubstituteAndAppend(std::string* absl_nonnull output, + absl::string_view format); inline void SubstituteAndAppend(std::string* absl_nonnull output, absl::string_view format, @@ -320,55 +304,33 @@ std::size(args)); } -inline void SubstituteAndAppend(std::string* absl_nonnull output, - absl::string_view format, - const substitute_internal::Arg& a0, - const substitute_internal::Arg& a1, - const substitute_internal::Arg& a2, - const substitute_internal::Arg& a3, - const substitute_internal::Arg& a4) { - const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), - a3.piece(), a4.piece()}; - substitute_internal::SubstituteAndAppendArray(output, format, args, - std::size(args)); -} +void SubstituteAndAppend(std::string* absl_nonnull output, + absl::string_view format, + const substitute_internal::Arg& a0, + const substitute_internal::Arg& a1, + const substitute_internal::Arg& a2, + const substitute_internal::Arg& a3, + const substitute_internal::Arg& a4); -inline void SubstituteAndAppend( +void SubstituteAndAppend( std::string* absl_nonnull output, absl::string_view format, const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, - const substitute_internal::Arg& a4, const substitute_internal::Arg& a5) { - const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), - a3.piece(), a4.piece(), a5.piece()}; - substitute_internal::SubstituteAndAppendArray(output, format, args, - std::size(args)); -} + const substitute_internal::Arg& a4, const substitute_internal::Arg& a5); -inline void SubstituteAndAppend( +void SubstituteAndAppend( std::string* absl_nonnull output, absl::string_view format, const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, const substitute_internal::Arg& a4, const substitute_internal::Arg& a5, - const substitute_internal::Arg& a6) { - const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), - a3.piece(), a4.piece(), a5.piece(), - a6.piece()}; - substitute_internal::SubstituteAndAppendArray(output, format, args, - std::size(args)); -} + const substitute_internal::Arg& a6); -inline void SubstituteAndAppend( +void SubstituteAndAppend( std::string* absl_nonnull output, absl::string_view format, const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, const substitute_internal::Arg& a4, const substitute_internal::Arg& a5, - const substitute_internal::Arg& a6, const substitute_internal::Arg& a7) { - const absl::string_view args[] = {a0.piece(), a1.piece(), a2.piece(), - a3.piece(), a4.piece(), a5.piece(), - a6.piece(), a7.piece()}; - substitute_internal::SubstituteAndAppendArray(output, format, args, - std::size(args)); -} + const substitute_internal::Arg& a6, const substitute_internal::Arg& a7); inline void SubstituteAndAppend( std::string* absl_nonnull output, absl::string_view format, @@ -384,19 +346,13 @@ std::size(args)); } -inline void SubstituteAndAppend( +void SubstituteAndAppend( std::string* absl_nonnull output, absl::string_view format, const substitute_internal::Arg& a0, const substitute_internal::Arg& a1, const substitute_internal::Arg& a2, const substitute_internal::Arg& a3, const substitute_internal::Arg& a4, const substitute_internal::Arg& a5, const substitute_internal::Arg& a6, const substitute_internal::Arg& a7, - const substitute_internal::Arg& a8, const substitute_internal::Arg& a9) { - const absl::string_view args[] = { - a0.piece(), a1.piece(), a2.piece(), a3.piece(), a4.piece(), - a5.piece(), a6.piece(), a7.piece(), a8.piece(), a9.piece()}; - substitute_internal::SubstituteAndAppendArray(output, format, args, - std::size(args)); -} + const substitute_internal::Arg& a8, const substitute_internal::Arg& a9); #if defined(ABSL_BAD_CALL_IF) // This body of functions catches cases where the number of placeholders