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
10namespace v8 {
11namespace internal {
12
13#ifdef DEBUG
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
29void BitVector::Iterator::Advance() {
30 current_++;
31 uintptr_t val = current_value_;
32 while (val == 0) {
33 current_index_++;
34 if (Done()) return;
35 DCHECK(!target_->is_inline());
36 val = target_->data_.ptr_[current_index_];
37 current_ = current_index_ << kDataBitShift;
38 }
39 val = SkipZeroBytes(val);
40 val = SkipZeroBits(val);
41 current_value_ = val >> 1;
42}
43
44
45int BitVector::Count() const {
46 if (data_length_ == 0) {
47 return base::bits::CountPopulation(data_.inline_);
48 } else {
49 int count = 0;
50 for (int i = 0; i < data_length_; i++) {
51 count += base::bits::CountPopulation(data_.ptr_[i]);
52 }
53 return count;
54 }
55}
56
57} // namespace internal
58} // namespace v8
59