diff options
-rw-r--r-- | absl/strings/cord_analysis.cc | 3 | ||||
-rw-r--r-- | absl/strings/cord_test.cc | 6 |
2 files changed, 9 insertions, 0 deletions
diff --git a/absl/strings/cord_analysis.cc b/absl/strings/cord_analysis.cc index b0f1a3e6..5418a325 100644 --- a/absl/strings/cord_analysis.cc +++ b/absl/strings/cord_analysis.cc @@ -157,6 +157,9 @@ size_t GetEstimatedUsage(const CordRep* rep) { // Consume the top level CRC node if present. if (repref.rep->tag == CRC) { raw_usage.Add(sizeof(CordRepCrc), repref); + if (repref.rep->crc()->child == nullptr) { + return static_cast<size_t>(raw_usage.total); + } repref = repref.Child(repref.rep->crc()->child); } diff --git a/absl/strings/cord_test.cc b/absl/strings/cord_test.cc index aba555fb..bf507094 100644 --- a/absl/strings/cord_test.cc +++ b/absl/strings/cord_test.cc @@ -3240,6 +3240,12 @@ TEST_P(CordTest, ChecksummedEmptyCord) { EXPECT_EQ(absl::HashOf(c3), absl::HashOf(absl::string_view())); } +TEST(CrcCordTest, ChecksummedEmptyCordEstimateMemoryUsage) { + absl::Cord cord; + cord.SetExpectedChecksum(0); + EXPECT_NE(cord.EstimatedMemoryUsage(), 0); +} + #if defined(GTEST_HAS_DEATH_TEST) && defined(ABSL_INTERNAL_CORD_HAVE_SANITIZER) // Returns an expected poison / uninitialized death message expression. |