20 #ifndef BEAST_INTRUSIVE_LOCKFREESTACK_H_INCLUDED
21 #define BEAST_INTRUSIVE_LOCKFREESTACK_H_INCLUDED
31 template <
class Container,
bool IsConst>
33 std::forward_iterator_tag,
34 typename Container::value_type,
35 typename Container::difference_type,
36 typename std::conditional<
38 typename Container::const_pointer,
39 typename Container::pointer>::type,
40 typename std::conditional<
42 typename Container::const_reference,
43 typename Container::reference>::type>
46 using Node =
typename Container::Node;
54 typename Container::const_pointer,
55 typename Container::pointer>::type;
58 typename Container::const_reference,
59 typename Container::reference>::type;
69 template <
bool OtherIsConst>
122 template <
class Container,
bool LhsIsConst,
bool RhsIsConst>
131 template <
class Container,
bool LhsIsConst,
bool RhsIsConst>
154 template <
class Element,
class Tag =
void>
176 template <
class Container,
bool IsConst>
225 Node* old_head =
m_head.load(std::memory_order_relaxed);
228 first = (old_head == &
m_end);
229 node->m_next = old_head;
230 }
while (!
m_head.compare_exchange_strong(
233 std::memory_order_release,
234 std::memory_order_relaxed));
250 Node* node =
m_head.load();
256 new_head = node->m_next.load();
257 }
while (!
m_head.compare_exchange_strong(
260 std::memory_order_release,
261 std::memory_order_relaxed));
262 return static_cast<Element*
>(node);
bool operator==(LockFreeStackIterator< Container, LhsIsConst > const &lhs, LockFreeStackIterator< Container, RhsIsConst > const &rhs)
LockFreeStackIterator & operator++()
const_iterator begin() const
LockFreeStackIterator(NodePtr node)
const_iterator cbegin() const
Node & operator=(Node const &)=delete
LockFreeStackIterator(LockFreeStackIterator< Container, OtherIsConst > const &other)
ripple::Workers::Worker const * const_pointer
pointer operator->() const
typename Container::Node Node
LockFreeStackIterator operator++(int)
bool operator!=(LockFreeStackIterator< Container, LhsIsConst > const &lhs, LockFreeStackIterator< Container, RhsIsConst > const &rhs)
LockFreeStack & operator=(LockFreeStack const &)=delete
typename std::conditional< IsConst, typename Container::const_reference, typename Container::reference >::type reference
const_iterator end() const
LockFreeStackIterator< LockFreeStack< Element, Tag >, true > const_iterator
typename std::conditional< IsConst, Node const *, Node * >::type NodePtr
std::atomic< Node * > m_head
reference operator*() const
Element * pop_front()
Pop an element off the stack.
LockFreeStackIterator & operator=(NodePtr node)
std::atomic< Node * > m_next
typename Container::value_type value_type
iterator begin()
Return a forward iterator to the beginning or end of the stack.
bool push_front(Node *node)
Push a node onto the stack.
LockFreeStackIterator< LockFreeStack< Element, Tag >, false > iterator
ripple::Workers::Worker const & const_reference
bool empty() const
Returns true if the stack is empty.
const_iterator cend() const
Multiple Producer, Multiple Consumer (MPMC) intrusive stack.
typename std::conditional< IsConst, typename Container::const_pointer, typename Container::pointer >::type pointer