LLVM: include/llvm/ADT/Bitset.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef LLVM_ADT_BITSET_H
17#define LLVM_ADT_BITSET_H
18
20#include
21#include
22#include
23
24namespace llvm {
25
26
27
28
29template
31 using BitWord = uintptr_t;
32
33 static constexpr unsigned BitwordBits = sizeof(BitWord) * CHAR_BIT;
34
35 static_assert(BitwordBits == 64 || BitwordBits == 32,
36 "Unsupported word size");
37
38 static constexpr unsigned NumWords =
39 (NumBits + BitwordBits - 1) / BitwordBits;
40
41 using StorageType = std::array<BitWord, NumWords>;
42 StorageType Bits{};
43
44protected:
45 constexpr Bitset(const std::array<uint64_t, (NumBits + 63) / 64> &B) {
46 if constexpr (sizeof(BitWord) == sizeof(uint64_t)) {
47 for (size_t I = 0; I != B.size(); ++I)
49 } else {
50 unsigned BitsToAssign = NumBits;
51 for (size_t I = 0; I != B.size() && BitsToAssign; ++I) {
53
54
55 for (size_t offset = 0; offset != 2 && BitsToAssign; ++offset) {
56 Bits[2 * I + offset] = static_cast<uint32_t>(Elt >> (32 * offset));
57 BitsToAssign = BitsToAssign >= 32 ? BitsToAssign - 32 : 0;
58 }
59 }
60 }
61 }
62
63public:
65 constexpr Bitset(std::initializer_list Init) {
68 }
69
74
76 Bits[I / BitwordBits] |= BitWord(1) << (I % BitwordBits);
77 return *this;
78 }
79
81 Bits[I / BitwordBits] &= ~(BitWord(1) << (I % BitwordBits));
82 return *this;
83 }
84
86 Bits[I / BitwordBits] ^= BitWord(1) << (I % BitwordBits);
87 return *this;
88 }
89
91 BitWord Mask = BitWord(1) << (I % BitwordBits);
92 return (Bits[I / BitwordBits] & Mask) != 0;
93 }
94
95 constexpr bool test(unsigned I) const { return (*this)[I]; }
96
97 constexpr size_t size() const { return NumBits; }
98
104 size_t Count = 0;
105 for (auto B : Bits)
108 }
109
111 for (unsigned I = 0, E = Bits.size(); I != E; ++I) {
113 }
114 return *this;
115 }
117 Bitset Result = *this;
118 Result ^= RHS;
119 return Result;
120 }
121
123 for (unsigned I = 0, E = Bits.size(); I != E; ++I)
125 return *this;
126 }
128 Bitset Result = *this;
129 Result &= RHS;
130 return Result;
131 }
132
134 for (unsigned I = 0, E = Bits.size(); I != E; ++I) {
136 }
137 return *this;
138 }
140 Bitset Result = *this;
141 Result |= RHS;
142 return Result;
143 }
144
146 Bitset Result = *this;
147 for (auto &B : Result.Bits)
149 return Result;
150 }
151
153 return std::equal(std::begin(Bits), std::end(Bits), std::begin(RHS.Bits));
154 }
155
157
159 for (unsigned I = 0, E = size(); I != E; ++I) {
163 }
164 return false;
165 }
166};
167
168}
169
170#endif
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
constexpr Bitset operator^(const Bitset &RHS) const
Definition Bitset.h:116
constexpr Bitset & set(unsigned I)
Definition Bitset.h:75
constexpr Bitset & flip(unsigned I)
Definition Bitset.h:85
bool operator<(const Bitset &Other) const
Definition Bitset.h:158
bool operator!=(const Bitset &RHS) const
Definition Bitset.h:156
constexpr Bitset(const std::array< uint64_t,(NumBits+63)/64 > &B)
Definition Bitset.h:45
constexpr Bitset()=default
constexpr Bitset & operator^=(const Bitset &RHS)
Definition Bitset.h:110
constexpr Bitset operator&(const Bitset &RHS) const
Definition Bitset.h:127
constexpr bool operator[](unsigned I) const
Definition Bitset.h:90
constexpr size_t size() const
Definition Bitset.h:97
size_t count() const
Definition Bitset.h:103
Bitset & set()
Definition Bitset.h:70
bool any() const
Definition Bitset.h:99
constexpr Bitset & operator|=(const Bitset &RHS)
Definition Bitset.h:133
bool operator==(const Bitset &RHS) const
Definition Bitset.h:152
constexpr Bitset(std::initializer_list< unsigned > Init)
Definition Bitset.h:65
constexpr Bitset & operator&=(const Bitset &RHS)
Definition Bitset.h:122
constexpr bool test(unsigned I) const
Definition Bitset.h:95
constexpr Bitset operator|(const Bitset &RHS) const
Definition Bitset.h:139
constexpr Bitset & reset(unsigned I)
Definition Bitset.h:80
bool none() const
Definition Bitset.h:102
constexpr Bitset operator~() const
Definition Bitset.h:145
This is an optimization pass for GlobalISel generic memory operations.
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
FunctionAddr VTableAddr Count