Simplify default constructors for absl::Cord and internal classes Removes an unidiomatic bifurcation between value-initialization and default-initialization, which hampers readability. PiperOrigin-RevId: 972169356 Change-Id: I9bf5c77a7b885148939929a49b0f1c77ae94994c
diff --git a/absl/strings/cord.cc b/absl/strings/cord.cc index 5827d89..6d9dd10 100644 --- a/absl/strings/cord.cc +++ b/absl/strings/cord.cc
@@ -301,8 +301,7 @@ // -------------------------------------------------------------------- // Constructors and destructors -Cord::Cord(absl::string_view src, MethodIdentifier method) - : contents_(InlineData::kDefaultInit) { +Cord::Cord(absl::string_view src, MethodIdentifier method) { const size_t n = src.size(); if (n <= InlineRep::kMaxInline) { contents_.set_data(src.data(), n); @@ -313,7 +312,7 @@ } template <typename T, Cord::EnableIfString<T>> -Cord::Cord(T&& src) : contents_(InlineData::kDefaultInit) { +Cord::Cord(T&& src) { if (src.size() <= InlineRep::kMaxInline) { contents_.set_data(src.data(), src.size()); } else { @@ -594,7 +593,7 @@ size_t cur_size = contents_.inline_size(); if (cur_size + src.size() <= InlineRep::kMaxInline) { // Use embedded storage. - InlineData data; + InlineData data{}; data.set_inline_size(cur_size + src.size()); memcpy(data.as_chars(), src.data(), src.size()); memcpy(data.as_chars() + src.size(), contents_.data(), cur_size); @@ -623,7 +622,7 @@ assert(src.size() <= cord_internal::kMaxFlatLength); if (contents_.remaining_inline_capacity() >= src.size()) { const size_t cur_size = contents_.inline_size(); - InlineData data; + InlineData data{}; data.set_inline_size(cur_size + src.size()); memcpy(data.as_chars(), src.data(), src.size()); memcpy(data.as_chars() + src.size(), contents_.data(), cur_size);
diff --git a/absl/strings/cord.h b/absl/strings/cord.h index fad5d97..cbba501 100644 --- a/absl/strings/cord.h +++ b/absl/strings/cord.h
@@ -920,8 +920,7 @@ static constexpr unsigned char kMaxInline = cord_internal::kMaxInline; static_assert(kMaxInline >= sizeof(absl::cord_internal::CordRep*)); - constexpr InlineRep() : data_() {} - explicit InlineRep(InlineData::DefaultInitType init) : data_(init) {} + InlineRep() = default; InlineRep(const InlineRep& src); InlineRep(InlineRep&& src); InlineRep& operator=(const InlineRep& src); @@ -1181,8 +1180,7 @@ CordRep* absl_nullable rep) : data_(sv, rep) {} -inline Cord::InlineRep::InlineRep(const Cord::InlineRep& src) - : data_(InlineData::kDefaultInit) { +inline Cord::InlineRep::InlineRep(const Cord::InlineRep& src) { if (CordRep* tree = src.tree()) { EmplaceTree(CordRep::Ref(tree), src.data_, CordzUpdateTracker::kConstructorCord); @@ -1364,7 +1362,7 @@ ResetToEmpty(); } -constexpr inline Cord::Cord() noexcept {} +constexpr inline Cord::Cord() noexcept : contents_() {} inline Cord::Cord(absl::string_view src) : Cord(src, CordzUpdateTracker::kConstructorString) {}
diff --git a/absl/strings/internal/cord_internal.h b/absl/strings/internal/cord_internal.h index cf45907..8a7e85f 100644 --- a/absl/strings/internal/cord_internal.h +++ b/absl/strings/internal/cord_internal.h
@@ -472,9 +472,6 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI InlineData { public: - // DefaultInitType forces the use of the default initialization constructor. - enum DefaultInitType { kDefaultInit }; - // kNullCordzInfo holds the little endian representation of intptr_t(1) // This is the 'null' / initial value of 'cordz_info'. The null value // is specifically big endian 1 as with 64-bit pointers, the last @@ -488,8 +485,6 @@ InlineData() = default; - explicit InlineData(DefaultInitType) noexcept : rep_(kDefaultInit) {} - explicit InlineData(CordRep* rep) noexcept : rep_(rep) { ABSL_ASSERT(rep != nullptr); } @@ -657,16 +652,16 @@ struct Rep { // See cordz_info_t for forced alignment and size of `cordz_info` details. struct AsTree { + AsTree() = default; + explicit constexpr AsTree(absl::cord_internal::CordRep* tree) - : rep(tree) {} - cordz_info_t cordz_info = kNullCordzInfo; + : cordz_info(kNullCordzInfo), rep(tree) {} + + cordz_info_t cordz_info; absl::cord_internal::CordRep* rep; }; - explicit Rep(DefaultInitType) {} - constexpr Rep() : data{0} {} - constexpr Rep(const Rep&) = default; - constexpr Rep& operator=(const Rep&) = default; + Rep() = default; explicit constexpr Rep(CordRep* rep) : as_tree(rep) {}
diff --git a/absl/strings/internal/cordz_info_statistics_test.cc b/absl/strings/internal/cordz_info_statistics_test.cc index 859bb20..fbd4b0e 100644 --- a/absl/strings/internal/cordz_info_statistics_test.cc +++ b/absl/strings/internal/cordz_info_statistics_test.cc
@@ -444,7 +444,7 @@ // Track 0 - 2 cordz infos at a time, providing permutations of 0, 1 // and 2 CordzHandle and CordzInfo queues being active, with plenty of // 'empty to non empty' transitions. - InlineData cords[2]; + InlineData cords[2] = {}; std::minstd_rand gen; std::uniform_int_distribution<int> coin_toss(0, 1); std::uniform_int_distribution<int> dice_roll(1, 6);