15#ifndef LLVM_ADT_ILIST_NODE_H
16#define LLVM_ADT_ILIST_NODE_H
35 return static_cast<const NodeTy *
>(
this)->getNodeBaseParent();
38 return static_cast<NodeTy *
>(
this)->getNodeBaseParent();
41 return static_cast<NodeTy *
>(
this)->setNodeBaseParent(Parent);
48template <
class OptionsT,
bool IsReverse,
bool IsConst>
class ilist_iterator;
49template <
class OptionsT,
bool IsReverse,
bool IsConst>
54template <
bool use_iterator_bits,
typename Opts,
bool arg1,
bool arg2>
56 using type = std::conditional_t<use_iterator_bits,
69template <
class OptionsT>
71 : OptionsT::node_base_type,
73 typename OptionsT::parent_ty> {
74 using value_type =
typename OptionsT::value_type;
75 using node_base_type =
typename OptionsT::node_base_type;
76 using list_base_type =
typename OptionsT::list_base_type;
78 friend typename OptionsT::list_base_type;
83 typename OptionsT::parent_ty>;
142 using node_base_type::isKnownSentinel;
153 template <
typename T = OptionsT>
154 std::enable_if_t<T::is_sentinel_tracking_explicit, bool>
isSentinel()
const {
155 return node_base_type::isSentinel();
217 typename ilist_detail::compute_node_options<T, Options...>::type> {
219 "Unrecognized node option!");
232 template <
class OptionsT>
237 template <
class OptionsT>
243 template <
class OptionsT>
245 return static_cast<typename OptionsT::pointer
>(
N);
248 template <
class OptionsT>
249 static typename OptionsT::const_pointer
251 return static_cast<typename OptionsT::const_pointer
>(
N);
254 template <
class OptionsT>
259 template <
class OptionsT>
264 template <
class OptionsT>
270 template <
class OptionsT>
302template <
class OptionsT>
306 this->initializeSentinel();
315 bool empty()
const {
return this == this->getPrev(); }
322template <
typename NodeTy,
typename ParentTy,
class...
Options>
333 const ParentTy *getNodeParent()
const {
334 return static_cast<const NodeTy *
>(
this)->
getParent();
345 getNodeParent()->*(ParentTy::getSublistAccess((NodeTy *)
nullptr));
346 return List.getPrevNode(*
static_cast<NodeTy *
>(
this));
359 getNodeParent()->*(ParentTy::getSublistAccess((NodeTy *)
nullptr));
360 return List.getNextNode(*
static_cast<NodeTy *
>(
this));
Mixin base class that is used to add getParent() and setParent(ParentTy*) methods to ilist_node_impl ...
const ParentTy * getParent() const
void setParent(ParentTy *Parent)
Iterator for intrusive lists based on ilist_node.
Iterator for intrusive lists based on ilist_node.
Implementation for an ilist node.
ilist_node_impl()=default
typename ilist_select_iterator_type< OptionsT::has_iterator_bits, OptionsT, false, true >::type const_self_iterator
const_reverse_self_iterator getReverseIterator() const
typename ilist_select_iterator_type< OptionsT::has_iterator_bits, OptionsT, true, true >::type const_reverse_self_iterator
typename ilist_select_iterator_type< OptionsT::has_iterator_bits, OptionsT, false, false >::type self_iterator
const_self_iterator getIterator() const
typename ilist_select_iterator_type< OptionsT::has_iterator_bits, OptionsT, true, false >::type reverse_self_iterator
reverse_self_iterator getReverseIterator()
std::enable_if_t< T::is_sentinel_tracking_explicit, bool > isSentinel() const
Check whether this is the sentinel node.
self_iterator getIterator()
const NodeTy * getPrevNode() const
Get the previous node, or nullptr for the list head.
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
const NodeTy * getNextNode() const
Get the next node, or nullptr for the list tail.
ilist_node_with_parent()=default
This is an optimization pass for GlobalISel generic memory operations.
An access class for ilist_node private API.
static ilist_node_impl< OptionsT > * getPrev(ilist_node_impl< OptionsT > &N)
static const ilist_node_impl< OptionsT > * getNext(const ilist_node_impl< OptionsT > &N)
static ilist_node_impl< OptionsT > * getNext(ilist_node_impl< OptionsT > &N)
static const ilist_node_impl< OptionsT > * getPrev(const ilist_node_impl< OptionsT > &N)
static ilist_node_impl< OptionsT > * getNodePtr(typename OptionsT::pointer N)
static const ilist_node_impl< OptionsT > * getNodePtr(typename OptionsT::const_pointer N)
static OptionsT::pointer getValuePtr(ilist_node_impl< OptionsT > *N)
static OptionsT::const_pointer getValuePtr(const ilist_node_impl< OptionsT > *N)
static pointer getValuePtr(node_type *N)
typename OptionsT::const_pointer const_pointer
static const_pointer getValuePtr(const node_type *N)
static const node_type * getNodePtr(const_pointer N)
ilist_node_impl< OptionsT > node_type
static node_type * getNodePtr(pointer N)
typename OptionsT::pointer pointer
Check whether options are valid.
std::conditional_t< use_iterator_bits, ilist_iterator_w_bits< Opts, arg1, arg2 >, ilist_iterator< Opts, arg1, arg2 > > type