1 // Copyright 2010 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/bit-vector.h" 6 7 #include "src/base/bits.h" 8 #include "src/utils.h" 9 10 namespace v8 { 11 namespace internal { 12 13 #ifdef DEBUG Print()14void BitVector::Print() { 15 bool first = true; 16 PrintF("{"); 17 for (int i = 0; i < length(); i++) { 18 if (Contains(i)) { 19 if (!first) PrintF(","); 20 first = false; 21 PrintF("%d", i); 22 } 23 } 24 PrintF("}\n"); 25 } 26 #endif 27 28 Advance()29void BitVector::Iterator::Advance() { 30 current_++; 31 uintptr_t val = current_value_; 32 while (val == 0) { 33 current_index_++; 34 if (Done()) return; 35 val = target_->data_[current_index_]; 36 current_ = current_index_ << kDataBitShift; 37 } 38 val = SkipZeroBytes(val); 39 val = SkipZeroBits(val); 40 current_value_ = val >> 1; 41 } 42 43 Count() const44int BitVector::Count() const { 45 int count = 0; 46 for (int i = 0; i < data_length_; i++) { 47 uintptr_t data = data_[i]; 48 if (sizeof(data) == 8) { 49 count += base::bits::CountPopulation64(data); 50 } else { 51 count += base::bits::CountPopulation32(static_cast<uint32_t>(data)); 52 } 53 } 54 return count; 55 } 56 57 } // namespace internal 58 } // namespace v8 59