32 static_assert(BitNum > 0,
"BitNum must be > 0");
38 unsigned NumElements = 0;
40 static T getValue(
const BitVectorTy &Bits,
unsigned Idx) {
41 if constexpr (std::numeric_limits<T>::is_signed) {
43 for (
unsigned i = 0; i != BitNum - 1; ++i)
44 val =
T(val | ((Bits[(Idx * BitNum) + i] ? 1UL : 0UL) << i));
45 if (Bits[(Idx * BitNum) + BitNum - 1])
50 for (
unsigned i = 0; i != BitNum; ++i)
51 val =
T(val | ((Bits[(Idx * BitNum) + i] ? 1UL : 0UL) << i));
56 static void setValue(BitVectorTy &Bits,
unsigned Idx,
T val) {
57 if constexpr (std::numeric_limits<T>::is_signed) {
60 Bits.set((Idx * BitNum) + BitNum - 1);
62 Bits.reset((Idx * BitNum) + BitNum - 1);
64 assert((val >> (BitNum - 1)) == 0 &&
"value is too big");
65 for (
unsigned i = 0; i != BitNum - 1; ++i)
66 Bits[(Idx * BitNum) + i] = val & (
T(1) << i);
68 assert((val >> BitNum) == 0 &&
"value is too big");
69 for (
unsigned i = 0; i != BitNum; ++i)
70 Bits[(Idx * BitNum) + i] = val & (
T(1) << i);
84 Vec.setValue(Vec.Bits, Idx, val);
88 operator T()
const {
return Vec.getValue(Vec.Bits, Idx); }
93 : Bits(
size * BitNum), NumElements(
size) {}
95 bool empty()
const {
return NumElements == 0; }
97 unsigned size()
const {
return NumElements; }
105 Bits.resize(
N * BitNum);
118 (*this)[
size() - 1] = val;
121 reference
operator[](
unsigned Idx) {
return reference(*
this, Idx); }
134 const BitVectorTy &
raw_bits()
const {
return Bits; }