OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 #include "vm/bitmap.h" | |
6 | |
7 #include "platform/assert.h" | |
8 #include "vm/object.h" | |
9 | |
10 namespace dart { | |
11 | |
12 bool BitmapBuilder::Get(int32_t bit_offset) const { | |
13 if (!InRange(bit_offset)) { | |
14 return false; | |
15 } | |
16 return GetBit(bit_offset); | |
17 } | |
18 | |
19 | |
20 void BitmapBuilder::Set(int32_t bit_offset, bool value) { | |
21 while (!InRange(bit_offset)) { | |
22 int32_t new_size = size_ + kIncrementSize; | |
23 ASSERT(new_size > size_); | |
24 uint8_t* new_bit_list = reinterpret_cast<uint8_t*>( | |
25 Isolate::Current()->current_zone()->Allocate(new_size)); | |
26 ASSERT(new_bit_list != NULL); | |
27 uint8_t* old_bit_list = | |
28 (size_ == kInitialSize) ? bit_list_ : bit_list_dynamic_; | |
srdjan
2012/03/14 17:31:32
You could instead have bit_list_dynamic_ point to
siva
2012/03/14 22:54:20
Good point. Done.
On 2012/03/14 17:31:32, srdjan
| |
29 memmove(new_bit_list, old_bit_list, size_); | |
30 memset((new_bit_list + size_), 0, kIncrementSize); | |
31 size_ = new_size; | |
32 bit_list_dynamic_ = new_bit_list; | |
33 } | |
34 SetBit(bit_offset, value); | |
35 } | |
36 | |
37 | |
38 // Return the bit offset of the highest bit set. | |
39 int32_t BitmapBuilder::Maximum() const { | |
40 int32_t bound = BitSize(); | |
41 for (int32_t i = bound; i >= 0; i--) { | |
srdjan
2012/03/14 17:31:32
intptr_t
siva
2012/03/14 22:54:20
Done.
| |
42 if (Get(i)) return i; | |
43 } | |
44 return Bitmap::kNoMaximum; | |
45 } | |
46 | |
47 | |
48 // Return the bit offset of the lowest bit set. | |
49 int32_t BitmapBuilder::Minimum() const { | |
50 int32_t bound = BitSize(); | |
51 for (int32_t i = 0; i < bound; i++) { | |
52 if (Get(i)) return i; | |
53 } | |
54 return Bitmap::kNoMinimum; | |
55 } | |
56 | |
57 | |
58 void BitmapBuilder::SetRange(int32_t min, int32_t max, bool value) { | |
59 for (int32_t i = min; i <= max; i++) { | |
60 Set(i, value); | |
61 } | |
62 } | |
63 | |
64 | |
65 void BitmapBuilder::SetBits(const Bitmap& bitmap) { | |
66 int32_t min = bitmap.Minimum(); | |
67 int32_t max = bitmap.Maximum(); | |
68 if (min == Bitmap::kNoMinimum || max == Bitmap::kNoMaximum) { | |
69 return; | |
70 } | |
71 for (int32_t i = min; i <= max; i++) { | |
72 Set(i, bitmap.Get(i)); | |
73 } | |
srdjan
2012/03/14 17:31:32
Don't you need to clear the bits outside Minimum..
siva
2012/03/14 22:54:20
Done.
| |
74 } | |
75 | |
76 | |
77 RawBitmap* BitmapBuilder::GetBitmap() const { | |
78 const Bitmap& bmap = Bitmap::Handle(Bitmap::New(size_)); | |
79 int32_t bound = BitSize(); | |
80 for (int32_t i = 0; i < bound; i++) { | |
81 bmap.SetBit(i, Get(i)); | |
82 } | |
83 return bmap.raw(); | |
84 } | |
85 | |
86 | |
87 bool BitmapBuilder::GetBit(int32_t bit_offset) const { | |
88 ASSERT(InRange(bit_offset)); | |
89 int byte_offset = bit_offset >> kBitsPerByteLog2; | |
90 int bit_remainder = bit_offset & (kBitsPerByte - 1); | |
91 uint8_t mask = 1U << bit_remainder; | |
92 if (size_ == kInitialSize) { | |
93 return ((bit_list_[byte_offset] & mask) != 0); | |
94 } else { | |
95 ASSERT(bit_list_dynamic_ != NULL); | |
96 return ((bit_list_dynamic_[byte_offset] & mask) != 0); | |
97 } | |
98 } | |
99 | |
100 | |
101 void BitmapBuilder::SetBit(int32_t bit_offset, bool value) { | |
102 ASSERT(InRange(bit_offset)); | |
103 int byte_offset = bit_offset >> kBitsPerByteLog2; | |
104 int bit_remainder = bit_offset & (kBitsPerByte - 1); | |
105 uint8_t mask = 1U << bit_remainder; | |
106 uint8_t* byte_addr; | |
107 if (size_ == kInitialSize) { | |
108 byte_addr = &(bit_list_[byte_offset]); | |
109 } else { | |
110 ASSERT(bit_list_dynamic_ != NULL); | |
111 byte_addr = &(bit_list_dynamic_[byte_offset]); | |
112 } | |
113 if (value) { | |
114 *byte_addr |= mask; | |
115 } else { | |
116 *byte_addr &= ~mask; | |
117 } | |
118 } | |
119 | |
120 } // namespace dart | |
OLD | NEW |