1515#ifndef TENSORSTORE_INTERNAL_FLAT_CORD_BUILDER_H_
1616#define TENSORSTORE_INTERNAL_FLAT_CORD_BUILDER_H_
1717
18+ #include < stddef.h>
19+
1820#include < cstdlib>
1921#include < cstring>
2022#include < string_view>
2325#include " absl/base/optimization.h"
2426#include " absl/log/absl_check.h"
2527#include " absl/strings/cord.h"
26- #include " absl/strings/string_view .h"
28+ #include " tensorstore/internal/os/memory_region .h"
2729
2830namespace tensorstore {
2931namespace internal {
@@ -39,67 +41,53 @@ class FlatCordBuilder {
3941 FlatCordBuilder () = default ;
4042 explicit FlatCordBuilder (size_t size) : FlatCordBuilder(size, size) {}
4143
44+ explicit FlatCordBuilder (internal_os::MemoryRegion region)
45+ : region_(std::move(region)), inuse_(region_.size()) {}
46+
4247 FlatCordBuilder (size_t size, size_t inuse)
43- : data_(static_cast <char *>(::malloc(size))),
44- size_ (size),
45- inuse_(inuse <= size ? inuse : size) {
46- ABSL_CHECK (size == 0 || data_);
48+ : FlatCordBuilder(internal_os::AllocateHeapRegion(size), inuse) {}
49+
50+ FlatCordBuilder (internal_os::MemoryRegion region, size_t inuse)
51+ : region_(std::move(region)), inuse_(inuse) {
52+ ABSL_CHECK (inuse <= region_.size ());
4753 }
4854
4955 FlatCordBuilder (const FlatCordBuilder&) = delete ;
5056 FlatCordBuilder& operator =(const FlatCordBuilder&) = delete ;
5157 FlatCordBuilder (FlatCordBuilder&& other)
52- : data_(std::exchange(other.data_, nullptr )),
53- size_(std::exchange(other.size_, 0 )),
58+ : region_(std::move(other.region_)),
5459 inuse_ (std::exchange(other.inuse_, 0 )) {}
60+
5561 FlatCordBuilder& operator =(FlatCordBuilder&& other) {
56- std::swap (data_, other.data_ );
57- std::swap (size_, other.size_ );
58- std::swap (inuse_, other.inuse_ );
62+ region_ = std::move (other.region_ );
63+ inuse_ = std::exchange (other.inuse_ , 0 );
5964 return *this ;
6065 }
61- ~FlatCordBuilder () {
62- if (data_) {
63- ::free (data_);
64- }
65- }
6666
67- const char * data () const { return data_; }
68- char * data () { return data_; }
69- size_t size () const { return size_; }
70- size_t available () const { return size_ - inuse_; }
67+ ~FlatCordBuilder () = default ;
68+
69+ const char * data () const { return region_.data (); }
70+ char * data () { return region_.data (); }
71+ size_t size () const { return region_.size (); }
72+ size_t available () const { return region_.size () - inuse_; }
7173
7274 void set_inuse (size_t size) {
73- ABSL_CHECK (size <= size_ );
75+ ABSL_CHECK (size <= region_. size () );
7476 inuse_ = size;
7577 }
7678
7779 // / Append data to the builder.
78- void Append (absl ::string_view sv) {
80+ void Append (std ::string_view sv) {
7981 if (ABSL_PREDICT_FALSE (sv.empty ())) return ;
8082 ABSL_CHECK (sv.size () <= available ());
81- ::memcpy (data_ + inuse_, sv.data(), sv.size());
83+ ::memcpy (region_.data() + inuse_, sv.data(), sv.size());
8284 inuse_ += sv.size ();
8385 }
8486
85- absl::Cord Build () && {
86- return absl::MakeCordFromExternal (release (), [](absl::string_view s) {
87- ::free (const_cast <char *>(s.data()));
88- });
89- }
87+ absl::Cord Build () && { return std::move (region_).as_cord (); }
9088
9189 private:
92- // / Releases ownership of the buffer. The caller must call `::free`.
93- absl::string_view release () {
94- absl::string_view view (data_, inuse_);
95- data_ = nullptr ;
96- size_ = 0 ;
97- inuse_ = 0 ;
98- return view;
99- }
100-
101- char * data_ = nullptr ;
102- size_t size_ = 0 ;
90+ internal_os::MemoryRegion region_;
10391 size_t inuse_ = 0 ;
10492};
10593
0 commit comments