diff options
author | Abseil Team <absl-team@google.com> | 2024-04-18 08:17:00 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-04-18 08:18:20 -0700 |
commit | 6645f3141269fdb88ba772439f7af7bcd87dd39a (patch) | |
tree | 7ad7595f719e20e103ed3d8e9cfe97f3bcde33cf /absl/strings/cord.h | |
parent | 4eb6f626f84779f7ba5a12f93acbaafd742c6851 (diff) | |
download | abseil-6645f3141269fdb88ba772439f7af7bcd87dd39a.tar.gz abseil-6645f3141269fdb88ba772439f7af7bcd87dd39a.tar.bz2 abseil-6645f3141269fdb88ba772439f7af7bcd87dd39a.zip |
Add `absl::AppendCordToString`
PiperOrigin-RevId: 626039936
Change-Id: I6e791363bab06d66029a8565c42d158a2fe176f0
Diffstat (limited to 'absl/strings/cord.h')
-rw-r--r-- | absl/strings/cord.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/absl/strings/cord.h b/absl/strings/cord.h index c9f6767b..95519cd3 100644 --- a/absl/strings/cord.h +++ b/absl/strings/cord.h @@ -105,6 +105,7 @@ class CordTestPeer; template <typename Releaser> Cord MakeCordFromExternal(absl::string_view, Releaser&&); void CopyCordToString(const Cord& src, absl::Nonnull<std::string*> dst); +void AppendCordToString(const Cord& src, absl::Nonnull<std::string*> dst); // Cord memory accounting modes enum class CordMemoryAccounting { @@ -421,6 +422,18 @@ class Cord { friend void CopyCordToString(const Cord& src, absl::Nonnull<std::string*> dst); + // AppendCordToString() + // + // Appends the contents of a `src` Cord to a `*dst` string. + // + // This function optimizes the case of appending to a non-empty destination + // string. If `*dst` already has capacity to store the contents of the cord, + // this function does not invalidate pointers previously returned by + // `dst->data()`. If `*dst` is a new object, prefer to simply use the + // conversion operator to `std::string`. + friend void AppendCordToString(const Cord& src, + absl::Nonnull<std::string*> dst); + class CharIterator; //---------------------------------------------------------------------------- @@ -1066,6 +1079,8 @@ class Cord { const; CharIterator FindImpl(CharIterator it, absl::string_view needle) const; + + void CopyToArrayImpl(absl::Nonnull<char*> dst) const; }; ABSL_NAMESPACE_END @@ -1450,6 +1465,14 @@ inline bool Cord::StartsWith(absl::string_view rhs) const { return EqualsImpl(rhs, rhs_size); } +inline void Cord::CopyToArrayImpl(absl::Nonnull<char*> dst) const { + if (!contents_.is_tree()) { + if (!empty()) contents_.CopyToArray(dst); + } else { + CopyToArraySlowPath(dst); + } +} + inline void Cord::ChunkIterator::InitTree( absl::Nonnull<cord_internal::CordRep*> tree) { tree = cord_internal::SkipCrcNode(tree); |