54 num_literals_ = o.num_literals_;
55 num_offsets_ = o.num_offsets_;
56 capacity_ = o.capacity_;
62 num_literals_ = o.num_literals_;
63 num_offsets_ = o.num_offsets_;
64 capacity_ = o.capacity_;
74 if (num_literals_ + num_offsets_ >= capacity_) {
77 DCHECK_LT(num_literals_ + num_offsets_, capacity_);
78 InternalAddress()[num_literals_++].literal = literal;
83 if (num_literals_ + num_offsets_ >= capacity_) {
86 DCHECK_LT(num_literals_ + num_offsets_, capacity_);
87 InternalAddress()[capacity_ - (++num_offsets_)].offset = offset;
93 absl::Span<const Literal>
literals()
const;
97 absl::Span<const Offset>
offsets()
const;
121 const uint32_t needed = num_literals_ + num_offsets_;
122 if (needed == capacity_)
return;
125 LiteralOrOffset* old_ptr = data_.ptr;
127 LiteralOrOffset* new_ptr =
static_cast<LiteralOrOffset*
>(
128 malloc(
static_cast<ptrdiff_t
>(needed) *
sizeof(LiteralOrOffset)));
129 CopyFromOldToNew(old_ptr, capacity_, new_ptr, needed);
142 CHECK_GE(new_size, 0);
143 CHECK_LE(new_size, num_literals_);
144 num_literals_ = new_size;
150 template <
typename Predicate>
160 union LiteralOrOffset {
164 static_assert(std::is_trivially_destructible_v<LiteralOrOffset>);
165 static_assert(std::is_trivially_copyable_v<LiteralOrOffset>);
167 LiteralOrOffset* InternalAddress() {
170 const LiteralOrOffset* InternalAddress()
const {
174 void CopyFromOldToNew(LiteralOrOffset* old_ptr, uint32_t old_capacity,
175 LiteralOrOffset* new_ptr, uint32_t new_capacity) {
176 memcpy(new_ptr, old_ptr, num_literals_ *
sizeof(LiteralOrOffset));
177 memcpy(new_ptr + (new_capacity - num_offsets_),
178 old_ptr + (old_capacity - num_offsets_),
179 num_offsets_ *
sizeof(LiteralOrOffset));
182 void GrowCapacity() {
185 CHECK_LE(capacity_, std::numeric_limits<uint32_t>::max() / 2);
186 const uint32_t new_capacity =
187 static_cast<uint32_t
>(1.3 *
static_cast<double>(capacity_));
190 LiteralOrOffset* new_ptr =
static_cast<LiteralOrOffset*
>(
191 malloc(
static_cast<ptrdiff_t
>(new_capacity) *
sizeof(LiteralOrOffset)));
192 CopyFromOldToNew(InternalAddress(), capacity_, new_ptr, new_capacity);
197 capacity_ = new_capacity;
204 uint32_t num_literals_ = 0;
205 uint32_t num_offsets_ = 0;