| // Copyright 2010 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/bit-vector.h" | |
| #include "src/base/bits.h" | |
| #include "src/utils.h" | |
| namespace v8 { | |
| namespace internal { | |
| #ifdef DEBUG | |
| void BitVector::Print() { | |
| bool first = true; | |
| PrintF("{"); | |
| for (int i = 0; i < length(); i++) { | |
| if (Contains(i)) { | |
| if (!first) PrintF(","); | |
| first = false; | |
| PrintF("%d", i); | |
| } | |
| } | |
| PrintF("}\n"); | |
| } | |
| #endif | |
| void BitVector::Iterator::Advance() { | |
| current_++; | |
| uintptr_t val = current_value_; | |
| while (val == 0) { | |
| current_index_++; | |
| if (Done()) return; | |
| DCHECK(!target_->is_inline()); | |
| val = target_->data_.ptr_[current_index_]; | |
| current_ = current_index_ << kDataBitShift; | |
| } | |
| val = SkipZeroBytes(val); | |
| val = SkipZeroBits(val); | |
| current_value_ = val >> 1; | |
| } | |
| int BitVector::Count() const { | |
| if (data_length_ == 0) { | |
| return base::bits::CountPopulation(data_.inline_); | |
| } else { | |
| int count = 0; | |
| for (int i = 0; i < data_length_; i++) { | |
| count += base::bits::CountPopulation(data_.ptr_[i]); | |
| } | |
| return count; | |
| } | |
| } | |
| } // namespace internal | |
| } // namespace v8 |