| Index: runtime/vm/bitfield.h
|
| diff --git a/runtime/vm/bitfield.h b/runtime/vm/bitfield.h
|
| index 6108065f1e6ace1164605d66dd32837568a6a0b4..42a121a20a1a6debd8145edf671b486f7b5d8f5b 100644
|
| --- a/runtime/vm/bitfield.h
|
| +++ b/runtime/vm/bitfield.h
|
| @@ -9,26 +9,26 @@ namespace dart {
|
|
|
| static const uword kUwordOne = 1U;
|
|
|
| -// BitField is a template for encoding and decoding a bit field inside
|
| -// an unsigned machine word.
|
| -template<typename T, int position, int size>
|
| +// BitField is a template for encoding and decoding a value of type T
|
| +// inside a storage of type S.
|
| +template<typename S, typename T, int position, int size>
|
| class BitField {
|
| public:
|
| static const intptr_t kNextBit = position + size;
|
|
|
| // Tells whether the provided value fits into the bit field.
|
| static bool is_valid(T value) {
|
| - return (static_cast<uword>(value) & ~((kUwordOne << size) - 1)) == 0;
|
| + return (static_cast<S>(value) & ~((kUwordOne << size) - 1)) == 0;
|
| }
|
|
|
| - // Returns a uword mask of the bit field.
|
| - static uword mask() {
|
| + // Returns a S mask of the bit field.
|
| + static S mask() {
|
| return (kUwordOne << size) - 1;
|
| }
|
|
|
| - // Returns a uword mask of the bit field which can be applied directly to
|
| + // Returns a S mask of the bit field which can be applied directly to
|
| // to the raw unshifted bits.
|
| - static uword mask_in_place() {
|
| + static S mask_in_place() {
|
| return ((kUwordOne << size) - 1) << position;
|
| }
|
|
|
| @@ -43,23 +43,24 @@ class BitField {
|
| return size;
|
| }
|
|
|
| - // Returns a uword with the bit field value encoded.
|
| - static uword encode(T value) {
|
| + // Returns an S with the bit field value encoded.
|
| + static S encode(T value) {
|
| + COMPILE_ASSERT((sizeof(S) * kBitsPerByte) >= (position + size));
|
| ASSERT(is_valid(value));
|
| - return static_cast<uword>(value) << position;
|
| + return static_cast<S>(value) << position;
|
| }
|
|
|
| // Extracts the bit field from the value.
|
| - static T decode(uword value) {
|
| + static T decode(S value) {
|
| return static_cast<T>((value >> position) & ((kUwordOne << size) - 1));
|
| }
|
|
|
| - // Returns a uword with the bit field value encoded based on the
|
| + // Returns an S with the bit field value encoded based on the
|
| // original value. Only the bits corresponding to this bit field
|
| // will be changed.
|
| - static uword update(T value, uword original) {
|
| + static S update(T value, S original) {
|
| ASSERT(is_valid(value));
|
| - return (static_cast<uword>(value) << position) |
|
| + return (static_cast<S>(value) << position) |
|
| (~mask_in_place() & original);
|
| }
|
| };
|
|
|