| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "src/trace_processor/containers/bit_vector.h" |
| |
| #include "src/trace_processor/containers/bit_vector_iterators.h" |
| |
| namespace perfetto { |
| namespace trace_processor { |
| |
| BitVector::BitVector() = default; |
| |
| BitVector::BitVector(std::initializer_list<bool> init) { |
| for (bool x : init) { |
| if (x) { |
| AppendTrue(); |
| } else { |
| AppendFalse(); |
| } |
| } |
| } |
| |
| BitVector::BitVector(uint32_t count, bool value) { |
| Resize(count, value); |
| } |
| |
| BitVector::BitVector(std::vector<Block> blocks, |
| std::vector<uint32_t> counts, |
| uint32_t size) |
| : size_(size), counts_(std::move(counts)), blocks_(std::move(blocks)) {} |
| |
| BitVector BitVector::Copy() const { |
| return BitVector(blocks_, counts_, size_); |
| } |
| |
| BitVector::AllBitsIterator BitVector::IterateAllBits() const { |
| return AllBitsIterator(this); |
| } |
| |
| BitVector::SetBitsIterator BitVector::IterateSetBits() const { |
| return SetBitsIterator(this); |
| } |
| |
| void BitVector::UpdateSetBits(const BitVector& o) { |
| PERFETTO_DCHECK(o.size() <= GetNumBitsSet()); |
| |
| // For each set bit in this bitvector, we lookup whether the bit in |other| |
| // at that index (if in bounds) is set. If not, we clear the bit. |
| for (auto it = IterateSetBits(); it; it.Next()) { |
| if (it.ordinal() >= o.size() || !o.IsSet(it.ordinal())) |
| it.Clear(); |
| } |
| |
| // After the loop, we should have precisely the same number of bits |
| // set as |other|. |
| PERFETTO_DCHECK(o.GetNumBitsSet() == GetNumBitsSet()); |
| } |
| |
| } // namespace trace_processor |
| } // namespace perfetto |