blob: 947263322c586b144bc884e9de3528a219a803af [file] [log] [blame]
// 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