45 std::size_t num_bits) {
47 if (source_words.size() <= std::numeric_limits<std::size_t>::max() / 64) {
48 num_bits_ = std::min(num_bits_, source_words.size() * 64);
54 std::numeric_limits<std::size_t>::max() - (kLowerBits - 1)) {
55 throw std::length_error(
"Orzo source padding is unrepresentable");
57 const std::size_t physical_bits =
58 ((num_bits_ + kLowerBits - 1) / kLowerBits) * kLowerBits;
59 words_.resize(physical_bits / 64, 0);
60 const std::size_t logical_words = num_bits_ / 64 + (num_bits_ % 64 != 0);
61 std::copy_n(source_words.begin(), logical_words, words_.begin());
62 if (num_bits_ % 64 != 0) {
63 words_[logical_words - 1] &= (std::uint64_t{1} << (num_bits_ % 64)) - 1;
66 std::size_t bucket_ones = 0;
67 std::size_t sample_entries = 0;
68 for (std::size_t word = 0; word < words_.size(); ++word) {
69 bucket_ones += std::popcount(words_[word]);
70 if ((word + 1) % (kSelectUpperBits / 64) == 0 ||
71 word + 1 == words_.size()) {
73 std::max<std::size_t>(1, bucket_ones / kSampleFrequency +
74 (bucket_ones % kSampleFrequency != 0));
78 const std::size_t upper_count = ceiling(physical_bits, kUpperBits);
79 const std::size_t lower_count = physical_bits / kLowerBits;
80 const std::size_t select_upper_count =
81 ceiling(physical_bits, kSelectUpperBits);
82 metadata_bytes_ = (upper_count + 2) *
sizeof(std::uint64_t) +
83 (lower_count + 1) *
sizeof(__uint128_t) +
84 (select_upper_count + 2) *
sizeof(std::uint64_t) +
85 select_upper_count *
sizeof(std::uint32_t*) +
86 sample_entries *
sizeof(std::uint32_t);
87 support_.emplace(words_.data(), physical_bits);
88 one_count_ = support_->get_one_count();