| 26 | } |
| 27 | |
| 28 | void EvaluatorStack::Reserve(size_t size) { |
| 29 | static_assert(alignof(cel::Value) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__); |
| 30 | static_assert(alignof(AttributeTrail) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__); |
| 31 | |
| 32 | if (max_size_ >= size) { |
| 33 | return; |
| 34 | } |
| 35 | |
| 36 | void* absl_nullability_unknown data = cel::internal::New(SizeBytes(size)); |
| 37 | |
| 38 | cel::Value* absl_nullability_unknown values_begin = |
| 39 | reinterpret_cast<cel::Value*>(data); |
| 40 | cel::Value* absl_nullability_unknown values = values_begin; |
| 41 | |
| 42 | AttributeTrail* absl_nullability_unknown attributes_begin = |
| 43 | reinterpret_cast<AttributeTrail*>(reinterpret_cast<uint8_t*>(data) + |
| 44 | AttributesBytesOffset(size)); |
| 45 | AttributeTrail* absl_nullability_unknown attributes = attributes_begin; |
| 46 | |
| 47 | if (max_size_ > 0) { |
| 48 | const size_t n = this->size(); |
| 49 | const size_t m = std::min(n, size); |
| 50 | |
| 51 | ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(values_begin, values_begin + size, |
| 52 | values_begin + size, values + m); |
| 53 | ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(attributes_begin, |
| 54 | attributes_begin + size, |
| 55 | attributes_begin + size, attributes + m); |
| 56 | |
| 57 | for (size_t i = 0; i < m; ++i) { |
| 58 | ::new (static_cast<void*>(values++)) |
| 59 | cel::Value(std::move(values_begin_[i])); |
| 60 | ::new (static_cast<void*>(attributes++)) |
| 61 | AttributeTrail(std::move(attributes_begin_[i])); |
| 62 | } |
| 63 | std::destroy_n(values_begin_, n); |
| 64 | std::destroy_n(attributes_begin_, n); |
| 65 | |
| 66 | ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(values_begin_, values_begin_ + max_size_, |
| 67 | values_, values_begin_ + max_size_); |
| 68 | ABSL_ANNOTATE_CONTIGUOUS_CONTAINER( |
| 69 | attributes_begin_, attributes_begin_ + max_size_, attributes_, |
| 70 | attributes_begin_ + max_size_); |
| 71 | |
| 72 | cel::internal::SizedDelete(data_, SizeBytes(max_size_)); |
| 73 | } else { |
| 74 | ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(values_begin, values_begin + size, |
| 75 | values_begin + size, values); |
| 76 | ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(attributes_begin, |
| 77 | attributes_begin + size, |
| 78 | attributes_begin + size, attributes); |
| 79 | } |
| 80 | |
| 81 | values_ = values; |
| 82 | values_begin_ = values_begin; |
| 83 | values_end_ = values_begin + size; |
| 84 | |
| 85 | attributes_ = attributes; |