5#ifndef V8_BASE_BIT_FIELD_H_
6#define V8_BASE_BIT_FIELD_H_
24template <
class T,
int shift,
int size,
class U = u
int32_t>
27 static_assert(std::is_unsigned<U>::value);
28 static_assert(shift < 8 *
sizeof(U));
29 static_assert(size < 8 *
sizeof(U));
30 static_assert(shift + size <= 8 *
sizeof(U));
31 static_assert(size > 0);
46 template <
class T2,
int size2>
51 return (
static_cast<U
>(value) & ~
kMax) == 0;
77template <
typename A,
typename B>
81 std::is_same<typename A::BaseType, typename B::BaseType>::value);
82 static_assert((A::kMask & B::kMask) == 0);
83 static constexpr int kShift = std::min(A::kShift, B::kShift);
84 static constexpr int kMask = A::kMask | B::kMask;
86 A::kSize + B::kSize + (std::max(A::kShift, B::kShift) -
kShift);
89template <
class T,
int shift,
int size>
92template <
class T,
int shift,
int size>
95template <
class T,
int shift,
int size>
112#define DEFINE_BIT_FIELD_RANGE_TYPE(Name, Type, Size, _) \
113 k##Name##Start, k##Name##End = k##Name##Start + Size - 1,
115#define DEFINE_BIT_RANGES(LIST_MACRO) \
116 struct LIST_MACRO##_Ranges { \
117 enum { LIST_MACRO(DEFINE_BIT_FIELD_RANGE_TYPE, _) kBitsCount }; \
120#define DEFINE_BIT_FIELD_TYPE(Name, Type, Size, RangesName) \
121 using Name = base::BitField<Type, RangesName::k##Name##Start, Size>;
123#define DEFINE_BIT_FIELD_64_TYPE(Name, Type, Size, RangesName) \
124 using Name = base::BitField64<Type, RangesName::k##Name##Start, Size>;
126#define DEFINE_BIT_FIELDS(LIST_MACRO) \
127 DEFINE_BIT_RANGES(LIST_MACRO) \
128 LIST_MACRO(DEFINE_BIT_FIELD_TYPE, LIST_MACRO##_Ranges)
130#define DEFINE_BIT_FIELDS_64(LIST_MACRO) \
131 DEFINE_BIT_RANGES(LIST_MACRO) \
132 LIST_MACRO(DEFINE_BIT_FIELD_64_TYPE, LIST_MACRO##_Ranges)
141template <
class T,
int kBitsPerItem,
int kBitsPerWord,
class U>
145 static const int kMask = (1 << kBitsPerItem) - 1;
149 if (items == 0)
return 0;
154 static int index(
int base_index,
int item) {
160 return static_cast<T
>((data >>
shift(item)) &
kMask);
165 int shift_value =
shift(item);
166 int set_bits = (
static_cast<int>(
value) << shift_value);
static constexpr int kMask
static constexpr int kShift
static constexpr int kSize
static constexpr int kLastUsedBit
static constexpr U kNumValues
static constexpr T decode(U value)
static constexpr bool is_valid(T value)
static constexpr U encode(T value)
static V8_NODISCARD constexpr U update(U previous, T value)
static constexpr int kSize
static constexpr int kShift
static int index(int base_index, int item)
static U encode(U previous, int item, T value)
static int word_count(int items)
static T decode(U data, int item)
static int shift(int item)
static const int kItemsPerWord
#define DCHECK(condition)
std::unique_ptr< ValueMirror > value