Skip to content

Commit bda5c03

Browse files
derekmaurocopybara-github
authored andcommitted
Use the new absl::StringResizeAndOverwrite() in absl::StrCat()
PiperOrigin-RevId: 821664382 Change-Id: I864eabd832c3e09b13373356b09954e1f2cc038c
1 parent fdb6e72 commit bda5c03

File tree

4 files changed

+65
-53
lines changed

4 files changed

+65
-53
lines changed

absl/strings/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ cc_library(
102102
deps = [
103103
":charset",
104104
":internal",
105+
":resize_and_overwrite",
105106
":string_view",
106107
"//absl/base",
107108
"//absl/base:config",

absl/strings/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ absl_cc_library(
7777
DEPS
7878
absl::string_view
7979
absl::strings_internal
80+
absl::strings_resize_and_overwrite
8081
absl::base
8182
absl::bits
8283
absl::charset

absl/strings/str_cat.cc

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
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

3233
namespace 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

absl/strings/str_cat.h

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
#include "absl/strings/internal/resize_uninitialized.h"
110110
#include "absl/strings/internal/stringify_sink.h"
111111
#include "absl/strings/numbers.h"
112+
#include "absl/strings/resize_and_overwrite.h"
112113
#include "absl/strings/string_view.h"
113114

114115
#if !defined(ABSL_USES_STD_STRING_VIEW)
@@ -471,23 +472,27 @@ std::string IntegerToString(Integer i) {
471472
// with 22 bytes (including NULL at the end).
472473
constexpr size_t kMaxDigits10 = 22;
473474
std::string result;
474-
strings_internal::STLStringResizeUninitialized(&result, kMaxDigits10);
475-
char* start = &result[0];
476-
// note: this can be optimized to not write last zero.
477-
char* end = numbers_internal::FastIntToBuffer(i, start);
478-
auto size = static_cast<size_t>(end - start);
479-
assert((size < result.size()) &&
480-
"StrCat(Integer) does not fit into kMaxDigits10");
481-
result.erase(size);
475+
StringResizeAndOverwrite(
476+
result, kMaxDigits10, [i](char* start, size_t buf_size) {
477+
// Note: This can be optimized to not write last zero.
478+
char* end = numbers_internal::FastIntToBuffer(i, start);
479+
auto size = static_cast<size_t>(end - start);
480+
ABSL_ASSERT(size < buf_size);
481+
return size;
482+
});
482483
return result;
483484
}
485+
484486
template <typename Float>
485487
std::string FloatToString(Float f) {
486488
std::string result;
487-
strings_internal::STLStringResizeUninitialized(
488-
&result, numbers_internal::kSixDigitsToBufferSize);
489-
char* start = &result[0];
490-
result.erase(numbers_internal::SixDigitsToBuffer(f, start));
489+
StringResizeAndOverwrite(result, numbers_internal::kSixDigitsToBufferSize,
490+
[f](char* start, size_t buf_size) {
491+
size_t size =
492+
numbers_internal::SixDigitsToBuffer(f, start);
493+
ABSL_ASSERT(size < buf_size);
494+
return size;
495+
});
491496
return result;
492497
}
493498

0 commit comments

Comments
 (0)