| 97 | } |
| 98 | |
| 99 | CBV CBV::Take(uint64_t n) const |
| 100 | { |
| 101 | if (IsEmpty()) |
| 102 | return *this; |
| 103 | if (IsFull()) |
| 104 | { |
| 105 | vector<uint64_t> groups(static_cast<size_t>((n + 63) / 64), numeric_limits<uint64_t>::max()); |
| 106 | uint64_t const r = n % 64; |
| 107 | if (r != 0) |
| 108 | { |
| 109 | ASSERT(!groups.empty(), ()); |
| 110 | groups.back() = (static_cast<uint64_t>(1) << r) - 1; |
| 111 | } |
| 112 | return CBV(coding::DenseCBV::BuildFromBitGroups(std::move(groups))); |
| 113 | } |
| 114 | |
| 115 | return CBV(m_p->LeaveFirstSetNBits(n)); |
| 116 | } |
| 117 | |
| 118 | uint64_t CBV::Hash() const |
| 119 | { |