9#ifndef LLVM_ADT_ILIST_ITERATOR_H 
   10#define LLVM_ADT_ILIST_ITERATOR_H 
   26  using pointer = 
typename OptionsT::pointer;
 
 
   33  using pointer = 
typename OptionsT::const_pointer;
 
   34  using reference = 
typename OptionsT::const_reference;
 
 
   56template <
class IteratorTy, 
class ParentTy, 
bool IsConst>
 
   58template <
class IteratorTy, 
class ParentTy>
 
   62    return static_cast<IteratorTy *
>(
this)->NodePtr->getParent();
 
 
 
   65template <
class IteratorTy, 
class ParentTy>
 
   69    return static_cast<IteratorTy *
>(
this)->NodePtr->getParent();
 
 
 
   72template <
class IteratorTy>
 
   74template <
class IteratorTy>
 
 
   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>;
 
  105  using node_pointer = 
typename Traits::node_pointer;
 
  106  using node_reference = 
typename Traits::node_reference;
 
  108  node_pointer NodePtr = 
nullptr;
 
  120  template <
bool RHSIsConst>
 
  122                 std::enable_if_t<IsConst || !RHSIsConst, void *> = 
nullptr)
 
  123      : NodePtr(
RHS.NodePtr) {}
 
 
  127  template <
bool RHSIsConst>
 
  128  std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator &>
 
  130    NodePtr = 
RHS.NodePtr;
 
 
  162                                             false>::node_reference>(*NodePtr));
 
 
  168    assert(!NodePtr->isKnownSentinel());
 
 
  175    return LHS.NodePtr == 
RHS.NodePtr;
 
 
  178    return LHS.NodePtr != 
RHS.NodePtr;
 
 
  183    NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();
 
 
  187    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
 
 
  204  node_pointer 
getNodePtr()
 const { 
return static_cast<node_pointer
>(NodePtr); }
 
  207  bool isEnd()
 const { 
return NodePtr ? NodePtr->isSentinel() : 
false; }
 
 
  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>;
 
  239  using node_pointer = 
typename Traits::node_pointer;
 
  240  using node_reference = 
typename Traits::node_reference;
 
  242  node_pointer NodePtr = 
nullptr;
 
  246  mutable bool HeadInclusiveBit = 
false;
 
  249  mutable bool TailInclusiveBit = 
false;
 
  263  template <
bool RHSIsConst>
 
  266      std::enable_if_t<IsConst || !RHSIsConst, void *> = 
nullptr)
 
  267      : NodePtr(
RHS.NodePtr) {
 
  268    HeadInclusiveBit = 
RHS.HeadInclusiveBit;
 
  269    TailInclusiveBit = 
RHS.TailInclusiveBit;
 
 
  274  template <
bool RHSIsConst>
 
  275  std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator_w_bits &>
 
  277    NodePtr = 
RHS.NodePtr;
 
  278    HeadInclusiveBit = 
RHS.HeadInclusiveBit;
 
  279    TailInclusiveBit = 
RHS.TailInclusiveBit;
 
 
  311                                                    false>::node_reference>(
 
  313      New.HeadInclusiveBit = HeadInclusiveBit;
 
  314      New.TailInclusiveBit = TailInclusiveBit;
 
 
  322    assert(!NodePtr->isKnownSentinel());
 
 
  330    return LHS.NodePtr == 
RHS.NodePtr;
 
 
  334    return LHS.NodePtr != 
RHS.NodePtr;
 
 
  339    NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();
 
  340    HeadInclusiveBit = 
false;
 
  341    TailInclusiveBit = 
false;
 
 
  345    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
 
  346    HeadInclusiveBit = 
false;
 
  347    TailInclusiveBit = 
false;
 
 
  364  node_pointer 
getNodePtr()
 const { 
return static_cast<node_pointer
>(NodePtr); }
 
  367  bool isEnd()
 const { 
return NodePtr ? NodePtr->isSentinel() : 
false; }
 
  371  void setHeadBit(
bool SetBit)
 const { HeadInclusiveBit = SetBit; }
 
  372  void setTailBit(
bool SetBit)
 const { TailInclusiveBit = SetBit; }
 
 
  375template <
typename From> 
struct simplify_type;
 
  381template <
class OptionsT, 
bool IsConst>
 
  388template <
class OptionsT, 
bool IsConst>
 
  390    : 
simplify_type<ilist_iterator<OptionsT, false, IsConst>> {};
 
 
  393template <
class OptionsT, 
bool IsConst>
 
  400template <
class OptionsT, 
bool IsConst>
 
  402    : 
simplify_type<ilist_iterator_w_bits<OptionsT, false, IsConst>> {};
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
ParentTy * getNodeParent()
 
const ParentTy * getNodeParent() const
 
Mixin class used to add a getNodeParent() function to iterators iff the list uses ilist_parent,...
 
Iterator for intrusive lists based on ilist_node.
 
ilist_iterator_w_bits()=default
 
ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > getReverse() const
 
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
 
ptrdiff_t difference_type
 
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
 
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
 
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
 
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)
 
ptrdiff_t difference_type
 
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)
 
ilist_detail::NodeAccess Access
 
static void increment(T *&I)
 
static void increment(T *&I)
 
ilist_detail::NodeAccess Access
 
static void decrement(T *&I)
 
typename OptionsT::value_type value_type
 
typename OptionsT::pointer pointer
 
ilist_node_impl< OptionsT > & node_reference
 
ilist_node_impl< OptionsT > * node_pointer
 
typename OptionsT::reference reference
 
typename OptionsT::const_pointer pointer
 
const ilist_node_impl< OptionsT > * node_pointer
 
const typename OptionsT::value_type value_type
 
const ilist_node_impl< OptionsT > & node_reference
 
typename OptionsT::const_reference reference
 
Find const-correct node types.
 
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
 
ilist_iterator< OptionsT, false, IsConst > iterator
 
static SimpleType getSimplifiedValue(const iterator &Node)
 
static SimpleType getSimplifiedValue(const iterator &Node)
 
ilist_iterator_w_bits< OptionsT, false, IsConst > iterator
 
typename iterator::pointer SimpleType
 
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...