2727#include " absl/base/internal/raw_logging.h"
2828#include " absl/base/nullability.h"
2929#include " absl/strings/internal/resize_uninitialized.h"
30+ #include " absl/strings/resize_and_overwrite.h"
3031#include " absl/strings/string_view.h"
3132
3233namespace absl {
@@ -67,13 +68,14 @@ std::string StrCat(const AlphaNum& a, const AlphaNum& b) {
6768 const uint64_t result_size =
6869 static_cast <uint64_t >(a.size ()) + static_cast <uint64_t >(b.size ());
6970 ABSL_INTERNAL_CHECK (result_size <= kMaxSize , " size_t overflow" );
70- absl::strings_internal::STLStringResizeUninitialized (
71- &result, static_cast <size_t >(result_size));
72- char * const begin = &result[0 ];
73- char * out = begin;
74- out = Append (out, a);
75- out = Append (out, b);
76- assert (out == begin + result.size ());
71+ absl::StringResizeAndOverwrite (result, static_cast <size_t >(result_size),
72+ [&a, &b](char * const begin, size_t buf_size) {
73+ char * out = begin;
74+ out = Append (out, a);
75+ out = Append (out, b);
76+ assert (out == begin + buf_size);
77+ return buf_size;
78+ });
7779 return result;
7880}
7981
@@ -86,14 +88,16 @@ std::string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c) {
8688 static_cast <uint64_t >(b.size ()) +
8789 static_cast <uint64_t >(c.size ());
8890 ABSL_INTERNAL_CHECK (result_size <= kMaxSize , " size_t overflow" );
89- strings_internal::STLStringResizeUninitialized (
90- &result, static_cast <size_t >(result_size));
91- char * const begin = &result[0 ];
92- char * out = begin;
93- out = Append (out, a);
94- out = Append (out, b);
95- out = Append (out, c);
96- assert (out == begin + result.size ());
91+ absl::StringResizeAndOverwrite (
92+ result, static_cast <size_t >(result_size),
93+ [&a, &b, &c](char * const begin, size_t buf_size) {
94+ char * out = begin;
95+ out = Append (out, a);
96+ out = Append (out, b);
97+ out = Append (out, c);
98+ assert (out == begin + buf_size);
99+ return buf_size;
100+ });
97101 return result;
98102}
99103
@@ -103,20 +107,21 @@ std::string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c,
103107 // Use uint64_t to prevent size_t overflow. We assume it is not possible for
104108 // in memory strings to overflow a uint64_t.
105109 constexpr uint64_t kMaxSize = uint64_t {std::numeric_limits<size_t >::max ()};
106- const uint64_t result_size = static_cast <uint64_t >(a.size ()) +
107- static_cast <uint64_t >(b.size ()) +
108- static_cast <uint64_t >(c.size ()) +
109- static_cast <uint64_t >(d.size ());
110+ const uint64_t result_size =
111+ static_cast <uint64_t >(a.size ()) + static_cast <uint64_t >(b.size ()) +
112+ static_cast <uint64_t >(c.size ()) + static_cast <uint64_t >(d.size ());
110113 ABSL_INTERNAL_CHECK (result_size <= kMaxSize , " size_t overflow" );
111- strings_internal::STLStringResizeUninitialized (
112- &result, static_cast <size_t >(result_size));
113- char * const begin = &result[0 ];
114- char * out = begin;
115- out = Append (out, a);
116- out = Append (out, b);
117- out = Append (out, c);
118- out = Append (out, d);
119- assert (out == begin + result.size ());
114+ absl::StringResizeAndOverwrite (
115+ result, static_cast <size_t >(result_size),
116+ [&a, &b, &c, &d](char * const begin, size_t buf_size) {
117+ char * out = begin;
118+ out = Append (out, a);
119+ out = Append (out, b);
120+ out = Append (out, c);
121+ out = Append (out, d);
122+ assert (out == begin + buf_size);
123+ return buf_size;
124+ });
120125 return result;
121126}
122127
@@ -133,19 +138,19 @@ std::string CatPieces(std::initializer_list<absl::string_view> pieces) {
133138 total_size += piece.size ();
134139 }
135140 ABSL_INTERNAL_CHECK (total_size <= kMaxSize , " size_t overflow" );
136- strings_internal::STLStringResizeUninitialized (
137- &result, static_cast < size_t >(total_size));
138-
139- char * const begin = &result[ 0 ];
140- char * out = begin ;
141- for (absl::string_view piece : pieces ) {
142- const size_t this_size = piece.size ( );
143- if (this_size != 0 ) {
144- memcpy (out, piece. data (), this_size);
145- out += this_size;
146- }
147- }
148- assert (out == begin + result. size () );
141+ absl::StringResizeAndOverwrite (result, static_cast < size_t >(total_size),
142+ [&pieces]( char * const begin, size_t buf_size) {
143+ char * out = begin;
144+ for (absl::string_view piece : pieces) {
145+ const size_t this_size = piece. size () ;
146+ if (this_size != 0 ) {
147+ memcpy (out, piece.data (), this_size );
148+ out += this_size;
149+ }
150+ }
151+ assert (out == begin + buf_size);
152+ return buf_size;
153+ } );
149154 return result;
150155}
151156
0 commit comments