| 588 | |
| 589 | template <class Deserializer> |
| 590 | static array_bucket deserialize(Deserializer& deserializer) { |
| 591 | array_bucket bucket; |
| 592 | const slz_size_type bucket_size_ds = |
| 593 | deserialize_value<slz_size_type>(deserializer); |
| 594 | |
| 595 | if (bucket_size_ds == 0) { |
| 596 | return bucket; |
| 597 | } |
| 598 | |
| 599 | const std::size_t bucket_size = numeric_cast<std::size_t>( |
| 600 | bucket_size_ds, "Deserialized bucket_size is too big."); |
| 601 | bucket.m_buffer = static_cast<CharT*>( |
| 602 | std::malloc(bucket_size * sizeof(CharT) + |
| 603 | sizeof_in_buff<decltype(END_OF_BUCKET)>())); |
| 604 | if (bucket.m_buffer == nullptr) { |
| 605 | throw std::bad_alloc(); |
| 606 | } |
| 607 | |
| 608 | deserializer(bucket.m_buffer, bucket_size); |
| 609 | |
| 610 | const auto end_of_bucket = END_OF_BUCKET; |
| 611 | std::memcpy(bucket.m_buffer + bucket_size, &end_of_bucket, |
| 612 | sizeof(end_of_bucket)); |
| 613 | |
| 614 | tsl_ah_assert(bucket.size() == bucket_size); |
| 615 | return bucket; |
| 616 | } |
| 617 | |
| 618 | private: |
| 619 | key_size_type as_key_size_type(size_type key_size) const { |