18
18
#include " llvm/ADT/ADL.h"
19
19
#include " llvm/ADT/EpochTracker.h"
20
20
#include " llvm/ADT/STLForwardCompat.h"
21
+ #include " llvm/ADT/iterator_range.h"
21
22
#include " llvm/Support/Compiler.h"
22
23
#include " llvm/Support/MathExtras.h"
23
24
#include " llvm/Support/ReverseIteration.h"
@@ -147,17 +148,23 @@ class SmallPtrSetImplBase : public DebugEpochBase {
147
148
return isSmall () ? CurArray + NumNonEmpty : CurArray + CurArraySize;
148
149
}
149
150
151
+ iterator_range<const void **> small_buckets () {
152
+ return make_range (CurArray, CurArray + NumNonEmpty);
153
+ }
154
+
155
+ iterator_range<const void *const *> small_buckets () const {
156
+ return {CurArray, CurArray + NumNonEmpty};
157
+ }
158
+
150
159
// / insert_imp - This returns true if the pointer was new to the set, false if
151
160
// / it was already in the set. This is hidden from the client so that the
152
161
// / derived class can check that the right type of pointer is passed in.
153
162
std::pair<const void *const *, bool > insert_imp (const void *Ptr) {
154
163
if (isSmall ()) {
155
164
// Check to see if it is already in the set.
156
- for (const void **APtr = CurArray, **E = CurArray + NumNonEmpty;
157
- APtr != E; ++APtr) {
158
- const void *Value = *APtr;
159
- if (Value == Ptr)
160
- return std::make_pair (APtr, false );
165
+ for (const void *&Bucket : small_buckets ()) {
166
+ if (Bucket == Ptr)
167
+ return std::make_pair (&Bucket, false );
161
168
}
162
169
163
170
// Nope, there isn't. If we stay small, just 'pushback' now.
@@ -177,10 +184,9 @@ class SmallPtrSetImplBase : public DebugEpochBase {
177
184
// / in.
178
185
bool erase_imp (const void * Ptr) {
179
186
if (isSmall ()) {
180
- for (const void **APtr = CurArray, **E = CurArray + NumNonEmpty;
181
- APtr != E; ++APtr) {
182
- if (*APtr == Ptr) {
183
- *APtr = CurArray[--NumNonEmpty];
187
+ for (const void *&Bucket : small_buckets ()) {
188
+ if (Bucket == Ptr) {
189
+ Bucket = CurArray[--NumNonEmpty];
184
190
incrementEpoch ();
185
191
return true ;
186
192
}
@@ -206,11 +212,9 @@ class SmallPtrSetImplBase : public DebugEpochBase {
206
212
const void *const * find_imp (const void * Ptr) const {
207
213
if (isSmall ()) {
208
214
// Linear search for the item.
209
- for (const void *const *APtr = CurArray, *const *E =
210
- CurArray + NumNonEmpty;
211
- APtr != E; ++APtr)
212
- if (*APtr == Ptr)
213
- return APtr;
215
+ for (const void *const &Bucket : small_buckets ())
216
+ if (Bucket == Ptr)
217
+ return &Bucket;
214
218
return EndPointer ();
215
219
}
216
220
@@ -223,10 +227,8 @@ class SmallPtrSetImplBase : public DebugEpochBase {
223
227
bool contains_imp (const void *Ptr) const {
224
228
if (isSmall ()) {
225
229
// Linear search for the item.
226
- const void *const *APtr = CurArray;
227
- const void *const *E = CurArray + NumNonEmpty;
228
- for (; APtr != E; ++APtr)
229
- if (*APtr == Ptr)
230
+ for (const void *const &Bucket : small_buckets ())
231
+ if (Bucket == Ptr)
230
232
return true ;
231
233
return false ;
232
234
}
0 commit comments