11template <
class Container,
bool IsConst>
15 using Node = Container::Node;
25 conditional_t<IsConst, typename Container::const_reference, typename Container::reference>;
33 template <
bool OtherIsConst>
85template <
class Container,
bool LhsIsConst,
bool RhsIsConst>
94template <
class Container,
bool LhsIsConst,
bool RhsIsConst>
117template <
class Element,
class Tag =
void>
139 template <
class Container,
bool IsConst>
187 Node* oldHead =
head_.load(std::memory_order_relaxed);
190 first = (oldHead == &
end_);
191 node->
next_ = oldHead;
192 }
while (!
head_.compare_exchange_strong(
193 oldHead, node, std::memory_order_release, std::memory_order_relaxed));
210 Node* newHead =
nullptr;
215 newHead = node->
next_.load();
216 }
while (!
head_.compare_exchange_strong(
217 node, newHead, std::memory_order_release, std::memory_order_relaxed));
218 return static_cast<Element*
>(node);
pointer operator->() const
reference operator*() const
Container::value_type value_type
LockFreeStackIterator()=default
std:: conditional_t< IsConst, typename Container::const_reference, typename Container::reference > reference
std::forward_iterator_tag iterator_category
LockFreeStackIterator & operator++()
LockFreeStackIterator & operator=(NodePtr node)
LockFreeStackIterator(LockFreeStackIterator< Container, OtherIsConst > const &other)
LockFreeStackIterator(NodePtr node)
Container::difference_type difference_type
std::conditional_t< IsConst, Node const *, Node * > NodePtr
std::conditional_t< IsConst, typename Container::const_pointer, typename Container::pointer > pointer
LockFreeStackIterator operator++(int)
Node(Node const &)=delete
Node & operator=(Node const &)=delete
friend class LockFreeStack
std::atomic< Node * > next_
friend class LockFreeStackIterator
const_iterator cend() const
bool pushFront(Node *node)
Push a node onto the stack.
LockFreeStackIterator< LockFreeStack< Element, Tag >, false > iterator
const_iterator cbegin() const
iterator begin()
Return a forward iterator to the beginning or end of the stack.
LockFreeStack(LockFreeStack const &)=delete
bool empty() const
Returns true if the stack is empty.
LockFreeStack & operator=(LockFreeStack const &)=delete
Element * popFront()
Pop an element off the stack.
Element const * const_pointer
std::atomic< Node * > head_
Element const & const_reference
std::ptrdiff_t difference_type
const_iterator begin() const
LockFreeStackIterator< LockFreeStack< Element, Tag >, true > const_iterator
const_iterator end() const
bool operator==(LockFreeStackIterator< Container, LhsIsConst > const &lhs, LockFreeStackIterator< Container, RhsIsConst > const &rhs)
bool operator!=(LockFreeStackIterator< Container, LhsIsConst > const &lhs, LockFreeStackIterator< Container, RhsIsConst > const &rhs)