20 #ifndef BEAST_INTRUSIVE_LOCKFREESTACK_H_INCLUDED
21 #define BEAST_INTRUSIVE_LOCKFREESTACK_H_INCLUDED
31 template <
class Container,
bool IsConst>
35 using Node =
typename Container::Node;
45 typename Container::const_pointer,
46 typename Container::pointer>::type;
49 typename Container::const_reference,
50 typename Container::reference>::type;
60 template <
bool OtherIsConst>
113 template <
class Container,
bool LhsIsConst,
bool RhsIsConst>
122 template <
class Container,
bool LhsIsConst,
bool RhsIsConst>
145 template <
class Element,
class Tag =
void>
167 template <
class Container,
bool IsConst>
216 Node* old_head =
m_head.load(std::memory_order_relaxed);
219 first = (old_head == &
m_end);
220 node->m_next = old_head;
221 }
while (!
m_head.compare_exchange_strong(
224 std::memory_order_release,
225 std::memory_order_relaxed));
241 Node* node =
m_head.load();
247 new_head = node->m_next.load();
248 }
while (!
m_head.compare_exchange_strong(
251 std::memory_order_release,
252 std::memory_order_relaxed));
253 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 Container::difference_type difference_type
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