36 unsigned NumElements = 0;
38 static T getValue(
const BitVectorTy &Bits,
unsigned Idx) {
39 if constexpr (std::numeric_limits<T>::is_signed) {
41 for (
unsigned i = 0; i != BitNum - 1; ++i)
42 val =
T(val | ((Bits[(Idx * BitNum) + i] ? 1UL : 0UL) << i));
43 if (Bits[(Idx * BitNum) + BitNum - 1])
48 for (
unsigned i = 0; i != BitNum; ++i)
49 val =
T(val | ((Bits[(Idx * BitNum) + i] ? 1UL : 0UL) << i));
54 static void setValue(BitVectorTy &Bits,
unsigned Idx,
T val) {
55 if constexpr (std::numeric_limits<T>::is_signed) {
58 Bits.set((Idx * BitNum) + BitNum - 1);
60 Bits.reset((Idx * BitNum) + BitNum - 1);
62 assert((val >> (BitNum - 1)) == 0 &&
"value is too big");
63 for (
unsigned i = 0; i != BitNum - 1; ++i)
64 Bits[(Idx * BitNum) + i] = val & (
T(1) << i);
66 assert((val >> BitNum) == 0 &&
"value is too big");
67 for (
unsigned i = 0; i != BitNum; ++i)
68 Bits[(Idx * BitNum) + i] = val & (
T(1) << i);
82 Vec.setValue(Vec.Bits, Idx, val);
86 operator T()
const {
return Vec.getValue(Vec.Bits, Idx); }
91 : Bits(
size * BitNum), NumElements(
size) {}
93 bool empty()
const {
return NumElements == 0; }
95 unsigned size()
const {
return NumElements; }
103 Bits.resize(
N * BitNum);
116 (*this)[
size() - 1] = val;
119 reference
operator[](
unsigned Idx) {
return reference(*
this, Idx); }
132 const BitVectorTy &
raw_bits()
const {
return Bits; }