50template <
typename T,
typename A>
51lock_free_stack<T, A>::lock_free_stack():
52 util::AllocatorConcurrentFreeList<A>(sizeof(node_t)),
55#if defined(__cpp_lib_atomic_is_always_lock_free)
56 static_assert(std::atomic<pointer_t>::is_always_lock_free);
58 LASS_ENFORCE(top_.is_lock_free());
64template <
typename T,
typename A>
65lock_free_stack<T, A>::~lock_free_stack()
67 node_t* top = top_.load(std::memory_order_acquire).get();
70 node_t*
const next = top->next;
82template <
typename T,
typename A>
83void lock_free_stack<T, A>::push(
const value_type& x)
92template <
typename T,
typename A>
93void lock_free_stack<T, A>::push(value_type&& x)
95 emplace(std::move(x));
102template <
typename T,
typename A>
103template <
class... Args>
104void lock_free_stack<T, A>::emplace(Args&&... args)
106 node_t* node = make_node();
109 new (&node->value) value_type(std::forward<Args>(args)...);
113 this->deallocate(node);
126template <
typename T,
typename A>
127bool lock_free_stack<T, A>::pop(value_type& x)
129 node_t*
const node = pop_node();
136 x = std::move(node->value);
155template <
typename T,
typename A>
156bool lock_free_stack<T, A>::pop_swap(value_type& x)
158 node_t*
const node = pop_node();
172template <
typename T,
typename A>
173typename lock_free_stack<T, A>::node_t*
174lock_free_stack<T, A>::make_node()
176 node_t* node =
static_cast<node_t*
>(this->allocate());
177 node->next =
nullptr;
183template <
typename T,
typename A>
184void lock_free_stack<T, A>::free_node(node_t* node)
186 node->value.~value_type();
187 this->deallocate(node);
192template <
typename T,
typename A>
193void lock_free_stack<T, A>::push_node(node_t* node)
195 pointer_t top = top_.load(std::memory_order_acquire);
199 node->next = top.get();
200 new_top = pointer_t(node, top.nextTag());
202 while (!top_.compare_exchange_weak(top, new_top));
207template <
typename T,
typename A>
208typename lock_free_stack<T, A>::node_t*
209lock_free_stack<T, A>::pop_node()
211 pointer_t top = top_.load(std::memory_order_acquire);
227 next = pointer_t(top->next, top.nextTag());
229 while (!top_.compare_exchange_weak(top, next));
const lass::python::impl::IterNextSlot next("__next__", Py_tp_iternext)
__next__ method (iterator next)
lass extensions to the standard library
Library for Assembled Shared Sources.