9#ifndef LLVM_ADT_ILIST_ITERATOR_H
10#define LLVM_ADT_ILIST_ITERATOR_H
20namespace ilist_detail {
26 using pointer =
typename OptionsT::pointer;
33 using pointer =
typename OptionsT::const_pointer;
34 using reference =
typename OptionsT::const_reference;
43 template <
class T>
static void increment(
T *&
I) {
I = Access::getNext(*
I); }
44 template <
class T>
static void decrement(
T *&
I) {
I = Access::getPrev(*
I); }
49 template <
class T>
static void increment(
T *&
I) {
I = Access::getPrev(*
I); }
50 template <
class T>
static void decrement(
T *&
I) {
I = Access::getNext(*
I); }
56template <
class OptionsT,
bool IsReverse,
bool IsConst>
75 using node_pointer =
typename Traits::node_pointer;
76 using node_reference =
typename Traits::node_reference;
78 node_pointer NodePtr =
nullptr;
90 template <
bool RHSIsConst>
92 std::enable_if_t<IsConst || !RHSIsConst, void *> =
nullptr)
93 : NodePtr(
RHS.NodePtr) {}
97 template <
bool RHSIsConst>
98 std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator &>
100 NodePtr =
RHS.NodePtr;
132 false>::node_reference>(*NodePtr));
138 assert(!NodePtr->isKnownSentinel());
145 return LHS.NodePtr ==
RHS.NodePtr;
148 return LHS.NodePtr !=
RHS.NodePtr;
153 NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();
157 NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
172 node_pointer
getNodePtr()
const {
return static_cast<node_pointer
>(NodePtr); }
175 bool isEnd()
const {
return NodePtr ? NodePtr->isSentinel() :
false; }
181template <
class OptionsT,
bool IsReverse,
bool IsConst>
200 using node_pointer =
typename Traits::node_pointer;
201 using node_reference =
typename Traits::node_reference;
203 node_pointer NodePtr =
nullptr;
205#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
211 mutable bool HeadInclusiveBit =
false;
214 mutable bool TailInclusiveBit =
false;
229 template <
bool RHSIsConst>
232 std::enable_if_t<IsConst || !RHSIsConst, void *> =
nullptr)
233 : NodePtr(
RHS.NodePtr) {
234#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
235 HeadInclusiveBit =
RHS.HeadInclusiveBit;
236 TailInclusiveBit =
RHS.TailInclusiveBit;
242 template <
bool RHSIsConst>
243 std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator_w_bits &>
245 NodePtr =
RHS.NodePtr;
246#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
247 HeadInclusiveBit =
RHS.HeadInclusiveBit;
248 TailInclusiveBit =
RHS.TailInclusiveBit;
281 false>::node_reference>(
283#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
284 New.HeadInclusiveBit = HeadInclusiveBit;
285 New.TailInclusiveBit = TailInclusiveBit;
294 assert(!NodePtr->isKnownSentinel());
302 return LHS.NodePtr ==
RHS.NodePtr;
306 return LHS.NodePtr !=
RHS.NodePtr;
311 NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();
312#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
313 HeadInclusiveBit =
false;
314 TailInclusiveBit =
false;
319 NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
320#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
321 HeadInclusiveBit =
false;
322 TailInclusiveBit =
false;
338 node_pointer
getNodePtr()
const {
return static_cast<node_pointer
>(NodePtr); }
341 bool isEnd()
const {
return NodePtr ? NodePtr->isSentinel() :
false; }
343#ifdef EXPERIMENTAL_DEBUGINFO_ITERATORS
344 bool getHeadBit()
const {
return HeadInclusiveBit; }
345 bool getTailBit()
const {
return TailInclusiveBit; }
346 void setHeadBit(
bool SetBit)
const { HeadInclusiveBit = SetBit; }
347 void setTailBit(
bool SetBit)
const { TailInclusiveBit = SetBit; }
357template <
typename From>
struct simplify_type;
363template <
class OptionsT,
bool IsConst>
370template <
class OptionsT,
bool IsConst>
372 :
simplify_type<ilist_iterator<OptionsT, false, IsConst>> {};
375template <
class OptionsT,
bool IsConst>
382template <
class OptionsT,
bool IsConst>
384 :
simplify_type<ilist_iterator_w_bits<OptionsT, false, IsConst>> {};
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Iterator for intrusive lists based on ilist_node.
ilist_iterator_w_bits()=default
ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > getReverse() const
Get a reverse iterator to the same node.
ilist_iterator_w_bits(reference NR)
ilist_iterator_w_bits & operator--()
typename OptionsT::const_pointer const_pointer
ilist_iterator_w_bits(const ilist_iterator_w_bits< OptionsT, IsReverse, RHSIsConst > &RHS, std::enable_if_t< IsConst||!RHSIsConst, void * >=nullptr)
pointer operator->() const
ilist_iterator_w_bits operator--(int)
ilist_iterator_w_bits(pointer NP)
typename OptionsT::const_reference const_reference
ilist_iterator_w_bits(node_reference N)
Create from an ilist_node.
std::bidirectional_iterator_tag iterator_category
ilist_iterator_w_bits< OptionsT, IsReverse, false > getNonConst() const
Const-cast.
node_pointer getNodePtr() const
Get the underlying ilist_node.
ilist_iterator_w_bits(const ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > &RHS)
Explicit conversion between forward/reverse iterators.
reference operator*() const
typename Traits::pointer pointer
ilist_iterator_w_bits & operator++()
friend bool operator==(const ilist_iterator_w_bits &LHS, const ilist_iterator_w_bits &RHS)
bool isEnd() const
Check for end. Only valid if ilist_sentinel_tracking<true>.
typename Traits::value_type value_type
ilist_iterator_w_bits operator++(int)
std::enable_if_t< IsConst||!RHSIsConst, ilist_iterator_w_bits & > operator=(const ilist_iterator_w_bits< OptionsT, IsReverse, RHSIsConst > &RHS)
void setTailBit(bool SetBit) const
void setHeadBit(bool SetBit) const
friend bool operator!=(const ilist_iterator_w_bits &LHS, const ilist_iterator_w_bits &RHS)
typename Traits::reference reference
Iterator for intrusive lists based on ilist_node.
typename Traits::reference reference
std::bidirectional_iterator_tag iterator_category
ilist_iterator(reference NR)
bool isEnd() const
Check for end. Only valid if ilist_sentinel_tracking<true>.
node_pointer getNodePtr() const
Get the underlying ilist_node.
friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS)
ilist_iterator operator--(int)
typename OptionsT::const_pointer const_pointer
ilist_iterator< OptionsT, !IsReverse, IsConst > getReverse() const
Get a reverse iterator to the same node.
reference operator*() const
ilist_iterator< OptionsT, IsReverse, false > getNonConst() const
Const-cast.
ilist_iterator & operator++()
typename Traits::value_type value_type
ilist_iterator(const ilist_iterator< OptionsT, !IsReverse, IsConst > &RHS)
Explicit conversion between forward/reverse iterators.
ilist_iterator(const ilist_iterator< OptionsT, IsReverse, RHSIsConst > &RHS, std::enable_if_t< IsConst||!RHSIsConst, void * >=nullptr)
friend bool operator==(const ilist_iterator &LHS, const ilist_iterator &RHS)
pointer operator->() const
ilist_iterator operator++(int)
ilist_iterator(node_reference N)
Create from an ilist_node.
ilist_iterator(pointer NP)
std::enable_if_t< IsConst||!RHSIsConst, ilist_iterator & > operator=(const ilist_iterator< OptionsT, IsReverse, RHSIsConst > &RHS)
typename OptionsT::const_reference const_reference
ilist_iterator & operator--()
typename Traits::pointer pointer
Implementation for an ilist node.
This file defines the ilist_node class template, which is a convenient base class for creating classe...
This is an optimization pass for GlobalISel generic memory operations.
static void decrement(T *&I)
static void increment(T *&I)
static void increment(T *&I)
static void decrement(T *&I)
typename OptionsT::value_type value_type
typename OptionsT::pointer pointer
typename OptionsT::reference reference
typename OptionsT::const_pointer pointer
const typename OptionsT::value_type value_type
typename OptionsT::const_reference reference
Find const-correct node types.
An access class for ilist_node private API.
static pointer getValuePtr(node_type *N)
typename iterator::pointer SimpleType
static SimpleType getSimplifiedValue(const iterator &Node)
static SimpleType getSimplifiedValue(const iterator &Node)
typename iterator::pointer SimpleType
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...