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; }
178template <
typename From>
struct simplify_type;
184template <
class OptionsT,
bool IsConst>
191template <
class OptionsT,
bool IsConst>
193 :
simplify_type<ilist_iterator<OptionsT, false, IsConst>> {};
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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)
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...