@@ -43,12 +43,12 @@ class TinyPtrVector {
43
43
TinyPtrVector () = default ;
44
44
45
45
~TinyPtrVector () {
46
- if (VecTy *V = Val. template dyn_cast <VecTy*>())
46
+ if (VecTy *V = dyn_cast_if_present <VecTy *>(Val ))
47
47
delete V;
48
48
}
49
49
50
50
TinyPtrVector (const TinyPtrVector &RHS) : Val(RHS.Val) {
51
- if (VecTy *V = Val. template dyn_cast <VecTy*>())
51
+ if (VecTy *V = dyn_cast_if_present <VecTy *>(Val ))
52
52
Val = new VecTy (*V);
53
53
}
54
54
@@ -62,20 +62,20 @@ class TinyPtrVector {
62
62
63
63
// Try to squeeze into the single slot. If it won't fit, allocate a copied
64
64
// vector.
65
- if (Val. template is <EltTy>()) {
65
+ if (isa <EltTy>(Val )) {
66
66
if (RHS.size () == 1 )
67
67
Val = RHS.front ();
68
68
else
69
- Val = new VecTy (*RHS. Val . template get <VecTy*>());
69
+ Val = new VecTy (*cast <VecTy *>(RHS. Val ));
70
70
return *this ;
71
71
}
72
72
73
73
// If we have a full vector allocated, try to re-use it.
74
- if (RHS. Val . template is <EltTy>()) {
75
- Val. template get <VecTy*>()->clear ();
76
- Val. template get <VecTy*>()->push_back (RHS.front ());
74
+ if (isa <EltTy>(RHS. Val )) {
75
+ cast <VecTy *>(Val )->clear ();
76
+ cast <VecTy *>(Val )->push_back (RHS.front ());
77
77
} else {
78
- *Val. template get <VecTy*>() = *RHS. Val . template get <VecTy*>();
78
+ *cast <VecTy *>(Val ) = *cast <VecTy *>(RHS. Val );
79
79
}
80
80
return *this ;
81
81
}
@@ -95,8 +95,8 @@ class TinyPtrVector {
95
95
// If this vector has been allocated on the heap, re-use it if cheap. If it
96
96
// would require more copying, just delete it and we'll steal the other
97
97
// side.
98
- if (VecTy *V = Val. template dyn_cast <VecTy*>()) {
99
- if (RHS. Val . template is <EltTy>()) {
98
+ if (VecTy *V = dyn_cast_if_present <VecTy *>(Val )) {
99
+ if (isa <EltTy>(RHS. Val )) {
100
100
V->clear ();
101
101
V->push_back (RHS.front ());
102
102
RHS.Val = EltTy ();
@@ -136,18 +136,18 @@ class TinyPtrVector {
136
136
operator ArrayRef<EltTy>() const {
137
137
if (Val.isNull ())
138
138
return std::nullopt;
139
- if (Val. template is <EltTy>())
139
+ if (isa <EltTy>(Val ))
140
140
return *Val.getAddrOfPtr1 ();
141
- return *Val. template get <VecTy*>();
141
+ return *cast <VecTy *>(Val );
142
142
}
143
143
144
144
// implicit conversion operator to MutableArrayRef.
145
145
operator MutableArrayRef<EltTy>() {
146
146
if (Val.isNull ())
147
147
return std::nullopt;
148
- if (Val. template is <EltTy>())
148
+ if (isa <EltTy>(Val ))
149
149
return *Val.getAddrOfPtr1 ();
150
- return *Val. template get <VecTy*>();
150
+ return *cast <VecTy *>(Val );
151
151
}
152
152
153
153
// Implicit conversion to ArrayRef<U> if EltTy* implicitly converts to U*.
@@ -163,17 +163,17 @@ class TinyPtrVector {
163
163
// This vector can be empty if it contains no element, or if it
164
164
// contains a pointer to an empty vector.
165
165
if (Val.isNull ()) return true ;
166
- if (VecTy *Vec = Val. template dyn_cast <VecTy*>())
166
+ if (VecTy *Vec = dyn_cast_if_present <VecTy *>(Val ))
167
167
return Vec->empty ();
168
168
return false ;
169
169
}
170
170
171
171
unsigned size () const {
172
172
if (empty ())
173
173
return 0 ;
174
- if (Val. template is <EltTy>())
174
+ if (isa <EltTy>(Val ))
175
175
return 1 ;
176
- return Val. template get <VecTy*>()->size ();
176
+ return cast <VecTy *>(Val )->size ();
177
177
}
178
178
179
179
using iterator = EltTy *;
@@ -182,17 +182,17 @@ class TinyPtrVector {
182
182
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
183
183
184
184
iterator begin () {
185
- if (Val. template is <EltTy>())
185
+ if (isa <EltTy>(Val ))
186
186
return Val.getAddrOfPtr1 ();
187
187
188
- return Val. template get <VecTy *>()->begin ();
188
+ return cast <VecTy *>(Val )->begin ();
189
189
}
190
190
191
191
iterator end () {
192
- if (Val. template is <EltTy>())
192
+ if (isa <EltTy>(Val ))
193
193
return begin () + (Val.isNull () ? 0 : 1 );
194
194
195
- return Val. template get <VecTy *>()->end ();
195
+ return cast <VecTy *>(Val )->end ();
196
196
}
197
197
198
198
const_iterator begin () const {
@@ -216,28 +216,27 @@ class TinyPtrVector {
216
216
217
217
EltTy operator [](unsigned i) const {
218
218
assert (!Val.isNull () && " can't index into an empty vector" );
219
- if (Val. template is <EltTy>()) {
219
+ if (isa <EltTy>(Val )) {
220
220
assert (i == 0 && " tinyvector index out of range" );
221
- return Val. template get <EltTy>();
221
+ return cast <EltTy>(Val );
222
222
}
223
223
224
- assert (i < Val.template get <VecTy*>()->size () &&
225
- " tinyvector index out of range" );
226
- return (*Val.template get <VecTy*>())[i];
224
+ assert (i < cast<VecTy *>(Val)->size () && " tinyvector index out of range" );
225
+ return (*cast<VecTy *>(Val))[i];
227
226
}
228
227
229
228
EltTy front () const {
230
229
assert (!empty () && " vector empty" );
231
- if (Val. template is <EltTy>())
232
- return Val. template get <EltTy>();
233
- return Val. template get <VecTy*>()->front ();
230
+ if (isa <EltTy>(Val ))
231
+ return cast <EltTy>(Val );
232
+ return cast <VecTy *>(Val )->front ();
234
233
}
235
234
236
235
EltTy back () const {
237
236
assert (!empty () && " vector empty" );
238
- if (Val. template is <EltTy>())
239
- return Val. template get <EltTy>();
240
- return Val. template get <VecTy*>()->back ();
237
+ if (isa <EltTy>(Val ))
238
+ return cast <EltTy>(Val );
239
+ return cast <VecTy *>(Val )->back ();
241
240
}
242
241
243
242
void push_back (EltTy NewVal) {
@@ -249,29 +248,29 @@ class TinyPtrVector {
249
248
}
250
249
251
250
// If we have a single value, convert to a vector.
252
- if (Val. template is <EltTy>()) {
253
- EltTy V = Val. template get <EltTy>();
251
+ if (isa <EltTy>(Val )) {
252
+ EltTy V = cast <EltTy>(Val );
254
253
Val = new VecTy ();
255
- Val. template get <VecTy*>()->push_back (V);
254
+ cast <VecTy *>(Val )->push_back (V);
256
255
}
257
256
258
257
// Add the new value, we know we have a vector.
259
- Val. template get <VecTy*>()->push_back (NewVal);
258
+ cast <VecTy *>(Val )->push_back (NewVal);
260
259
}
261
260
262
261
void pop_back () {
263
262
// If we have a single value, convert to empty.
264
- if (Val. template is <EltTy>())
263
+ if (isa <EltTy>(Val ))
265
264
Val = (EltTy)nullptr ;
266
- else if (VecTy *Vec = Val. template get <VecTy*>())
265
+ else if (VecTy *Vec = cast <VecTy *>(Val ))
267
266
Vec->pop_back ();
268
267
}
269
268
270
269
void clear () {
271
270
// If we have a single value, convert to empty.
272
- if (Val. template is <EltTy>()) {
271
+ if (isa <EltTy>(Val )) {
273
272
Val = EltTy ();
274
- } else if (VecTy *Vec = Val. template dyn_cast <VecTy*>()) {
273
+ } else if (VecTy *Vec = dyn_cast_if_present <VecTy *>(Val )) {
275
274
// If we have a vector form, just clear it.
276
275
Vec->clear ();
277
276
}
@@ -283,10 +282,10 @@ class TinyPtrVector {
283
282
assert (I < end () && " Erasing at past-the-end iterator." );
284
283
285
284
// If we have a single value, convert to empty.
286
- if (Val. template is <EltTy>()) {
285
+ if (isa <EltTy>(Val )) {
287
286
if (I == begin ())
288
287
Val = EltTy ();
289
- } else if (VecTy *Vec = Val. template dyn_cast <VecTy*>()) {
288
+ } else if (VecTy *Vec = dyn_cast_if_present <VecTy *>(Val )) {
290
289
// multiple items in a vector; just do the erase, there is no
291
290
// benefit to collapsing back to a pointer
292
291
return Vec->erase (I);
@@ -299,10 +298,10 @@ class TinyPtrVector {
299
298
assert (S <= E && " Trying to erase invalid range." );
300
299
assert (E <= end () && " Trying to erase past the end." );
301
300
302
- if (Val. template is <EltTy>()) {
301
+ if (isa <EltTy>(Val )) {
303
302
if (S == begin () && S != E)
304
303
Val = EltTy ();
305
- } else if (VecTy *Vec = Val. template dyn_cast <VecTy*>()) {
304
+ } else if (VecTy *Vec = dyn_cast_if_present <VecTy *>(Val )) {
306
305
return Vec->erase (S, E);
307
306
}
308
307
return end ();
@@ -316,15 +315,15 @@ class TinyPtrVector {
316
315
return std::prev (end ());
317
316
}
318
317
assert (!Val.isNull () && " Null value with non-end insert iterator." );
319
- if (Val. template is <EltTy>()) {
320
- EltTy V = Val. template get <EltTy>();
318
+ if (isa <EltTy>(Val )) {
319
+ EltTy V = cast <EltTy>(Val );
321
320
assert (I == begin ());
322
321
Val = Elt;
323
322
push_back (V);
324
323
return begin ();
325
324
}
326
325
327
- return Val. template get <VecTy*>()->insert (I, Elt);
326
+ return cast <VecTy *>(Val )->insert (I, Elt);
328
327
}
329
328
330
329
template <typename ItTy>
@@ -343,12 +342,12 @@ class TinyPtrVector {
343
342
}
344
343
345
344
Val = new VecTy ();
346
- } else if (Val. template is <EltTy>()) {
347
- EltTy V = Val. template get <EltTy>();
345
+ } else if (isa <EltTy>(Val )) {
346
+ EltTy V = cast <EltTy>(Val );
348
347
Val = new VecTy ();
349
- Val. template get <VecTy*>()->push_back (V);
348
+ cast <VecTy *>(Val )->push_back (V);
350
349
}
351
- return Val. template get <VecTy*>()->insert (begin () + Offset, From, To);
350
+ return cast <VecTy *>(Val )->insert (begin () + Offset, From, To);
352
351
}
353
352
};
354
353
0 commit comments