14 #ifndef LLVM_ADT_PACKEDVECTOR_H
15 #define LLVM_ADT_PACKEDVECTOR_H
22 template <
typename T,
unsigned BitNum,
typename BitVectorTy,
bool isSigned>
27 template <
typename T,
unsigned BitNum,
typename BitVectorTy>
32 for (
unsigned i = 0; i != BitNum; ++i)
33 val =
T(val | ((Bits[(Idx << (BitNum-1)) + i] ? 1UL : 0UL) << i));
38 assert((val >> BitNum) == 0 &&
"value is too big");
39 for (
unsigned i = 0; i != BitNum; ++i)
40 Bits[(Idx << (BitNum-1)) + i] = val & (
T(1) << i);
44 template <
typename T,
unsigned BitNum,
typename BitVectorTy>
49 for (
unsigned i = 0; i != BitNum-1; ++i)
50 val =
T(val | ((Bits[(Idx << (BitNum-1)) + i] ? 1UL : 0UL) << i));
51 if (Bits[(Idx << (BitNum-1)) + BitNum-1])
59 Bits.set((Idx << (BitNum-1)) + BitNum-1);
61 assert((val >> (BitNum-1)) == 0 &&
"value is too big");
62 for (
unsigned i = 0; i != BitNum-1; ++i)
63 Bits[(Idx << (BitNum-1)) + i] = val & (
T(1) << i);
74 template <
typename T,
unsigned BitNum,
typename BitVectorTy = BitVector>
76 std::numeric_limits<T>::is_signed> {
79 std::numeric_limits<T>::is_signed>
base;
91 Vec.setValue(Vec.Bits, Idx, val);
95 return Vec.getValue(Vec.Bits, Idx);
102 bool empty()
const {
return Bits.empty(); }
104 unsigned size()
const {
return Bits.size() >> (BitNum-1); }
108 void resize(
unsigned N) { Bits.resize(N << (BitNum-1)); }
110 void reserve(
unsigned N) { Bits.reserve(N << (BitNum-1)); }
119 (*this)[
size()-1] = val;
127 return base::getValue(Bits, Idx);
131 return Bits == RHS.Bits;
135 return Bits != RHS.Bits;
154 template <
typename T>
155 class PackedVector<
T, 0>;
PackedVector & operator|=(const PackedVector &RHS)
void swap(PackedVector &RHS)
bool operator!=(const PackedVector &RHS) const
static T getValue(const BitVectorTy &Bits, unsigned Idx)
const PackedVector & operator=(const PackedVector &RHS)
reference operator[](unsigned Idx)
bool operator==(const PackedVector &RHS) const
static T getValue(const BitVectorTy &Bits, unsigned Idx)
static void setValue(BitVectorTy &Bits, unsigned Idx, T val)
Store a vector of values using a specific number of bits for each value. Both signed and unsigned typ...
PackedVector(unsigned size)
T operator[](unsigned Idx) const
reference(PackedVector &vec, unsigned idx)
static void setValue(BitVectorTy &Bits, unsigned Idx, T val)
reference & operator=(T val)