| // Copyright 2026 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "util/bit_vector.h" | |
| #include <algorithm> | |
| namespace openscreen { | |
| BitVector::BitVector(size_t size, Fill fill) { | |
| Resize(size, fill); | |
| } | |
| void BitVector::Resize(size_t size, Fill fill) { | |
| size_ = size; | |
| v_.assign((size + kBitsPerWord - 1) / kBitsPerWord, | |
| fill ? ~uint64_t{0} : uint64_t{0}); | |
| if (fill && size % kBitsPerWord != 0) { | |
| v_.back() &= (uint64_t{1} << (size % kBitsPerWord)) - 1; | |
| } | |
| } | |
| size_t BitVector::FindFirstSet() const { | |
| for (size_t i = 0; i < v_.size(); ++i) { | |
| if (v_[i] != 0) { | |
| size_t pos = i * kBitsPerWord + std::countr_zero(v_[i]); | |
| return (pos < size_) ? pos : size_; | |
| } | |
| } | |
| return size_; | |
| } | |
| } // namespace openscreen |