LLVM: include/llvm/ADT/ilist_iterator.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9#ifndef LLVM_ADT_ILIST_ITERATOR_H
10#define LLVM_ADT_ILIST_ITERATOR_H
11
13#include
14#include
15#include
16#include <type_traits>
17
18namespace llvm {
19
21
22
32 using value_type = const typename OptionsT::value_type;
33 using pointer = typename OptionsT::const_pointer;
34 using reference = typename OptionsT::const_reference;
37};
38
52
53
54
55
56template <class IteratorTy, class ParentTy, bool IsConst>
58template <class IteratorTy, class ParentTy>
60public:
62 return static_cast<IteratorTy *>(this)->NodePtr->getParent();
63 }
64};
65template <class IteratorTy, class ParentTy>
67public:
69 return static_cast<IteratorTy *>(this)->NodePtr->getParent();
70 }
71};
72template
74template
76
77}
78
79
80template <class OptionsT, bool IsReverse, bool IsConst>
83 ilist_iterator<OptionsT, IsReverse, IsConst>,
84 typename OptionsT::parent_ty, IsConst> {
90 typename OptionsT::parent_ty, IsConst>;
91
94
95public:
96 using value_type = typename Traits::value_type;
97 using pointer = typename Traits::pointer;
98 using reference = typename Traits::reference;
103
104private:
105 using node_pointer = typename Traits::node_pointer;
106 using node_reference = typename Traits::node_reference;
107
108 node_pointer NodePtr = nullptr;
109
110public:
111
113
117
118
119
120 template
122 std::enable_if_t<IsConst || !RHSIsConst, void *> = nullptr)
123 : NodePtr(RHS.NodePtr) {}
124
125
126
127 template
128 std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator &>
130 NodePtr = RHS.NodePtr;
131 return *this;
132 }
133
134
135
136
137
138
139
140
141
145
146
147
148
149
150
156
157
159 if (NodePtr)
161 const_cast<typename ilist_iterator<OptionsT, IsReverse,
162 false>::node_reference>(*NodePtr));
164 }
165
166
168 assert(!NodePtr->isKnownSentinel());
170 }
172
173
175 return LHS.NodePtr == RHS.NodePtr;
176 }
178 return LHS.NodePtr != RHS.NodePtr;
179 }
180
181
183 NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();
184 return *this;
185 }
187 NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
188 return *this;
189 }
192 --*this;
193 return tmp;
194 }
197 ++*this;
198 return tmp;
199 }
200
201 bool isValid() const { return NodePtr; }
202
203
204 node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
205
206
207 bool isEnd() const { return NodePtr ? NodePtr->isSentinel() : false; }
208};
209
210
211
212
213template <class OptionsT, bool IsReverse, bool IsConst>
217 ilist_iterator_w_bits<OptionsT, IsReverse, IsConst>,
218 typename OptionsT::parent_ty, IsConst> {
224 typename OptionsT::parent_ty, IsConst>;
225
228
229public:
231 using pointer = typename Traits::pointer;
232 using reference = typename Traits::reference;
237
238private:
239 using node_pointer = typename Traits::node_pointer;
240 using node_reference = typename Traits::node_reference;
241
242 node_pointer NodePtr = nullptr;
243
244
245
246 mutable bool HeadInclusiveBit = false;
247
248
249 mutable bool TailInclusiveBit = false;
250
251public:
252
254
260
261
262
263 template
266 std::enable_if_t<IsConst || !RHSIsConst, void *> = nullptr)
267 : NodePtr(RHS.NodePtr) {
268 HeadInclusiveBit = RHS.HeadInclusiveBit;
269 TailInclusiveBit = RHS.TailInclusiveBit;
270 }
271
272
273
274 template
275 std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator_w_bits &>
277 NodePtr = RHS.NodePtr;
278 HeadInclusiveBit = RHS.HeadInclusiveBit;
279 TailInclusiveBit = RHS.TailInclusiveBit;
280 return *this;
281 }
282
283
284
285
286
287
288
289
290
294
295
296
297
298
299
305
306
308 if (NodePtr) {
311 false>::node_reference>(
312 *NodePtr));
313 New.HeadInclusiveBit = HeadInclusiveBit;
314 New.TailInclusiveBit = TailInclusiveBit;
315 return New;
316 }
318 }
319
320
322 assert(!NodePtr->isKnownSentinel());
324 }
326
327
330 return LHS.NodePtr == RHS.NodePtr;
331 }
334 return LHS.NodePtr != RHS.NodePtr;
335 }
336
337
339 NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();
340 HeadInclusiveBit = false;
341 TailInclusiveBit = false;
342 return *this;
343 }
345 NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
346 HeadInclusiveBit = false;
347 TailInclusiveBit = false;
348 return *this;
349 }
352 --*this;
353 return tmp;
354 }
357 ++*this;
358 return tmp;
359 }
360
361 bool isValid() const { return NodePtr; }
362
363
364 node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
365
366
367 bool isEnd() const { return NodePtr ? NodePtr->isSentinel() : false; }
368
369 bool getHeadBit() const { return HeadInclusiveBit; }
370 bool getTailBit() const { return TailInclusiveBit; }
371 void setHeadBit(bool SetBit) const { HeadInclusiveBit = SetBit; }
372 void setTailBit(bool SetBit) const { TailInclusiveBit = SetBit; }
373};
374
375template struct simplify_type;
376
377
378
379
380
381template <class OptionsT, bool IsConst>
388template <class OptionsT, bool IsConst>
390 : simplify_type<ilist_iterator<OptionsT, false, IsConst>> {};
391
392
393template <class OptionsT, bool IsConst>
400template <class OptionsT, bool IsConst>
402 : simplify_type<ilist_iterator_w_bits<OptionsT, false, IsConst>> {};
403
404}
405
406#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
ParentTy * getNodeParent()
Definition ilist_iterator.h:68
const ParentTy * getNodeParent() const
Definition ilist_iterator.h:61
Mixin class used to add a getNodeParent() function to iterators iff the list uses ilist_parent,...
Definition ilist_iterator.h:57
Iterator for intrusive lists based on ilist_node.
Definition ilist_iterator.h:218
ilist_iterator_w_bits()=default
ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > getReverse() const
Definition ilist_iterator.h:300
ilist_iterator_w_bits(reference NR)
Definition ilist_iterator.h:257
ilist_iterator_w_bits & operator--()
Definition ilist_iterator.h:338
typename OptionsT::const_pointer const_pointer
Definition ilist_iterator.h:235
ilist_iterator_w_bits(const ilist_iterator_w_bits< OptionsT, IsReverse, RHSIsConst > &RHS, std::enable_if_t< IsConst||!RHSIsConst, void * >=nullptr)
Definition ilist_iterator.h:264
pointer operator->() const
Definition ilist_iterator.h:325
ilist_iterator_w_bits operator--(int)
Definition ilist_iterator.h:350
ilist_iterator_w_bits(pointer NP)
Definition ilist_iterator.h:255
typename OptionsT::const_reference const_reference
Definition ilist_iterator.h:236
ptrdiff_t difference_type
Definition ilist_iterator.h:233
bool isValid() const
Definition ilist_iterator.h:361
ilist_iterator_w_bits(node_reference N)
Create from an ilist_node.
Definition ilist_iterator.h:253
std::bidirectional_iterator_tag iterator_category
Definition ilist_iterator.h:234
ilist_iterator_w_bits< OptionsT, IsReverse, false > getNonConst() const
Const-cast.
Definition ilist_iterator.h:307
node_pointer getNodePtr() const
Definition ilist_iterator.h:364
ilist_iterator_w_bits(const ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > &RHS)
Explicit conversion between forward/reverse iterators.
Definition ilist_iterator.h:291
reference operator*() const
Definition ilist_iterator.h:321
typename Traits::pointer pointer
Definition ilist_iterator.h:231
ilist_iterator_w_bits & operator++()
Definition ilist_iterator.h:344
friend bool operator==(const ilist_iterator_w_bits &LHS, const ilist_iterator_w_bits &RHS)
Definition ilist_iterator.h:328
bool isEnd() const
Check for end. Only valid if ilist_sentinel_tracking.
Definition ilist_iterator.h:367
typename Traits::value_type value_type
Definition ilist_iterator.h:230
ilist_iterator_w_bits operator++(int)
Definition ilist_iterator.h:355
bool getHeadBit() const
Definition ilist_iterator.h:369
std::enable_if_t< IsConst||!RHSIsConst, ilist_iterator_w_bits & > operator=(const ilist_iterator_w_bits< OptionsT, IsReverse, RHSIsConst > &RHS)
Definition ilist_iterator.h:276
bool getTailBit() const
Definition ilist_iterator.h:370
void setTailBit(bool SetBit) const
Definition ilist_iterator.h:372
void setHeadBit(bool SetBit) const
Definition ilist_iterator.h:371
friend bool operator!=(const ilist_iterator_w_bits &LHS, const ilist_iterator_w_bits &RHS)
Definition ilist_iterator.h:332
typename Traits::reference reference
Definition ilist_iterator.h:232
Iterator for intrusive lists based on ilist_node.
Definition ilist_iterator.h:84
typename Traits::reference reference
Definition ilist_iterator.h:98
std::bidirectional_iterator_tag iterator_category
Definition ilist_iterator.h:100
ilist_iterator(reference NR)
Definition ilist_iterator.h:115
bool isEnd() const
Check for end. Only valid if ilist_sentinel_tracking.
Definition ilist_iterator.h:207
node_pointer getNodePtr() const
Definition ilist_iterator.h:204
friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS)
Definition ilist_iterator.h:177
ilist_iterator operator--(int)
Definition ilist_iterator.h:190
typename OptionsT::const_pointer const_pointer
Definition ilist_iterator.h:101
ilist_iterator< OptionsT, !IsReverse, IsConst > getReverse() const
Definition ilist_iterator.h:151
reference operator*() const
Definition ilist_iterator.h:167
ilist_iterator< OptionsT, IsReverse, false > getNonConst() const
Const-cast.
Definition ilist_iterator.h:158
ilist_iterator & operator++()
Definition ilist_iterator.h:186
typename Traits::value_type value_type
Definition ilist_iterator.h:96
ilist_iterator(const ilist_iterator< OptionsT, !IsReverse, IsConst > &RHS)
Explicit conversion between forward/reverse iterators.
Definition ilist_iterator.h:142
ilist_iterator(const ilist_iterator< OptionsT, IsReverse, RHSIsConst > &RHS, std::enable_if_t< IsConst||!RHSIsConst, void * >=nullptr)
Definition ilist_iterator.h:121
bool isValid() const
Definition ilist_iterator.h:201
friend bool operator==(const ilist_iterator &LHS, const ilist_iterator &RHS)
Definition ilist_iterator.h:174
pointer operator->() const
Definition ilist_iterator.h:171
ilist_iterator operator++(int)
Definition ilist_iterator.h:195
ptrdiff_t difference_type
Definition ilist_iterator.h:99
ilist_iterator(node_reference N)
Create from an ilist_node.
Definition ilist_iterator.h:112
ilist_iterator(pointer NP)
Definition ilist_iterator.h:114
std::enable_if_t< IsConst||!RHSIsConst, ilist_iterator & > operator=(const ilist_iterator< OptionsT, IsReverse, RHSIsConst > &RHS)
Definition ilist_iterator.h:129
typename OptionsT::const_reference const_reference
Definition ilist_iterator.h:102
ilist_iterator & operator--()
Definition ilist_iterator.h:182
typename Traits::pointer pointer
Definition ilist_iterator.h:97
Implementation for an ilist node.
This file defines the ilist_node class template, which is a convenient base class for creating classe...
Definition ilist_iterator.h:20
This is an optimization pass for GlobalISel generic memory operations.
static void decrement(T *&I)
Definition ilist_iterator.h:44
ilist_detail::NodeAccess Access
Definition ilist_iterator.h:41
static void increment(T *&I)
Definition ilist_iterator.h:43
static void increment(T *&I)
Definition ilist_iterator.h:49
ilist_detail::NodeAccess Access
Definition ilist_iterator.h:47
static void decrement(T *&I)
Definition ilist_iterator.h:50
Definition ilist_iterator.h:39
typename OptionsT::value_type value_type
Definition ilist_iterator.h:25
typename OptionsT::pointer pointer
Definition ilist_iterator.h:26
ilist_node_impl< OptionsT > & node_reference
Definition ilist_iterator.h:29
ilist_node_impl< OptionsT > * node_pointer
Definition ilist_iterator.h:28
typename OptionsT::reference reference
Definition ilist_iterator.h:27
typename OptionsT::const_pointer pointer
Definition ilist_iterator.h:33
const ilist_node_impl< OptionsT > * node_pointer
Definition ilist_iterator.h:35
const typename OptionsT::value_type value_type
Definition ilist_iterator.h:32
const ilist_node_impl< OptionsT > & node_reference
Definition ilist_iterator.h:36
typename OptionsT::const_reference reference
Definition ilist_iterator.h:34
Find const-correct node types.
Definition ilist_iterator.h:23
An access class for ilist_node private API.
static ilist_node_impl< OptionsT > * getPrev(ilist_node_impl< OptionsT > &N)
static ilist_node_impl< OptionsT > * getNext(ilist_node_impl< OptionsT > &N)
static pointer getValuePtr(node_type *N)
typename iterator::pointer SimpleType
Definition ilist_iterator.h:384
ilist_iterator< OptionsT, false, IsConst > iterator
Definition ilist_iterator.h:383
static SimpleType getSimplifiedValue(const iterator &Node)
Definition ilist_iterator.h:386
static SimpleType getSimplifiedValue(const iterator &Node)
Definition ilist_iterator.h:398
ilist_iterator_w_bits< OptionsT, false, IsConst > iterator
Definition ilist_iterator.h:395
typename iterator::pointer SimpleType
Definition ilist_iterator.h:396
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...