21 template<
class V,
class LkT>
23 stack<V, LkT>::
empty()
const noexcept(
true) {
28 template<
class V,
class LkT>
30 stack<V, LkT>::
size()
const noexcept(
true) {
34 template<
class V,
class LkT>
36 stack<V, LkT>::
size_n()
const noexcept(
true) {
38 for ([[maybe_unused]]
auto const &i: *
this) {
44 template<
class V,
class LkT>
46 stack<V, LkT>::
stack()
noexcept(
true)
50 assert(prefront_.next.get()==
nullptr || prefront_.next->sp_count());
53 template<
class V,
class LkT>
55 stack<V, LkT>::
stack(stack &&s)
noexcept(
true)
61 template<
class V,
class LkT>
63 stack<V, LkT>::
top()
noexcept(
true) {
64 assert(prefront_.next.get()==
nullptr || prefront_.next->sp_count());
65 assert(prefront_.next->sp_count()>0);
69 template<
class V,
class LkT>
71 stack<V, LkT>::
top()
const noexcept(
true) {
72 assert(prefront_.next.get()==
nullptr || prefront_.next->sp_count());
73 assert(prefront_.next->sp_count()>0);
77 template<
class V,
class LkT>
78 inline typename stack<V, LkT>::
iterator
79 stack<V, LkT>::
begin()
noexcept(
true) {
83 template<
class V,
class LkT>
85 stack<V, LkT>::
begin()
const noexcept(
true) {
89 template<
class V,
class LkT>
90 inline typename stack<V, LkT>::
iterator
91 stack<V, LkT>::
end()
noexcept(
true) {
95 template<
class V,
class LkT>
97 stack<V, LkT>::
end()
const noexcept(
true) {
98 return private_::end<V
const, LkT>();
101 template<
class V,
class LkT>
103 stack<V, LkT>::
unlink_node(
typename node_details_t::base_t::atomic_ptr_t &node)
noexcept(
true) {
104 using ptr_t=
typename node_details_t::base_t::atomic_ptr_t;
106 return node.assign([](ptr_t
const &ptr) {
return ptr->next;});
109 template<
class V,
class LkT>
111 stack<V, LkT>::
pop()
noexcept(
true) {
112 if (!
this->empty()) {
117 assert(retain_next->sp_count()>=1);
120 unlinked_node->sp_release();
121 assert(unlinked_node->sp_count()>=1);
123 assert(prefront_.next.get()==
nullptr || prefront_.next->sp_count()>=1);
127 template<
class V,
class LkT>
130 if (!
this->empty()) {
131 if (v==
this->begin()) {
133 }
else if (v!=
this->end()) {
136 assert(del->sp_count()>0);
139 assert(del->sp_count()>0);
144 template<
class V,
class LkT>
148 while (start!=end() && *start!=v) {
159 template<
class V,
class LkT>
165 template<
class V,
class LkT>
167 stack<V, LkT>::
clear()
noexcept(
true) {
168 while (!
this->empty()) {
169 this->erase(
this->begin());
171 assert(
this->empty());
174 template<
class V,
class LkT>
176 stack<V, LkT>::~
stack()
noexcept(
true) {
180 template<
class V,
class LkT>
182 stack<V, LkT>::
insert(
typename node_details_t::base_t::atomic_ptr_t i,
value_type v)
noexcept(
true) {
183 assert(v->sp_count()>=0);
186 assert(v->sp_count()>=1);
187 assert(
dynamic_cast<
typename node_details_t::base_t::atomic_ptr_t::value_type>(i.get()));
188 typename node_details_t::base_t::atomic_ptr_t expected;
191 assert(
static_cast<
bool>(i));
193 assert(
dynamic_cast<
typename node_details_t::base_t::atomic_ptr_t::value_type>(v.get().get()));
195 }
while (!i->next.compare_exchange_strong(expected.get(), v.get().get()));
196 assert(i->next->sp_count()>=1);
197 assert(v->sp_count()>=1);
200 template<
class V,
class LkT>
203 assert(v->sp_count()>=1);
206 assert(v->sp_count()>=1);
207 typename node_details_t::base_t::atomic_ptr_t expected;
211 assert(
dynamic_cast<
typename node_details_t::base_t::atomic_ptr_t::value_type>(v.get().get()));
213 }
while (!
prefront_.next.compare_exchange_strong(expected.get(), v.get().get()));
214 assert(
dynamic_cast<
typename node_details_t::base_t::atomic_ptr_t::value_type>(prefront_.next.get()));
215 assert(prefront_.next->sp_count()>=1);
216 assert(v->sp_count()>=1);
220 template<
class V,
class LkT>
226 template<
class V,
class LkT>
232 template<
class V,
class LkT>
235 this->push(
std::move(v));
238 template<
class V,
class LkT>
244 template<
class V,
class LkT>
252 assert(ret->sp_count()>=1);
257 template<
class V,
class LkT>
260 :
base_t(), penultimate_() {
263 template<
class V,
class LkT>
266 :
base_t(), penultimate_() {
267 s.prefront_.sp_acquire();
268 this->prefront_.swap(s.prefront_);
269 this->prefront_.sp_release();
270 penultimate_.swap(s.penultimate_);
271 this->size_ctr.swap(s.size_ctr);
274 template<
class V,
class LkT>
280 template<
class V,
class LkT>
286 template<
class V,
class LkT>
289 if (!
this->empty()) {
290 return std::find(
this->begin(),
this->end(), v);
296 template<
class V,
class LkT>
299 if (!
this->empty()) {
300 return std::find(
this->begin(),
this->end(), v);
306 template<
class V,
class LkT>
310 if (!
this->prefront_.next.get()) {
311 penultimate_=
typename node_details_t::base_t::atomic_ptr_t();
315 template<
class V,
class LkT>
319 iterator iter_to_erase(
this->begin());
320 while ((iter_to_erase=
std::find(iter_to_erase,
this->end(), v))!=
this->end()) {
321 this->erase(iter_to_erase++);
327 template<
class V,
class LkT>
332 template<
class V,
class LkT>
335 assert(penultimate_->next->sp_count()>0);
339 template<
class V,
class LkT>
342 assert(penultimate_->next->sp_count()>0);
346 template<
class V,
class LkT>
349 typename node_details_t::base_t::atomic_ptr_t
const was_empty=
this->prefront_.next;
350 this->insert(
typename node_details_t::base_t::atomic_ptr_t(&
this->prefront_), v);
351 if (!was_empty.get()) {
352 penultimate_=&
this->prefront_;
353 }
else if (!v->next->next) {
354 penultimate_=v.get().get();
359 template<
class V,
class LkT>
362 typename node_details_t::base_t::atomic_ptr_t
const was_empty=
this->prefront_.next;
363 this->insert(
typename node_details_t::base_t::atomic_ptr_t(&
this->prefront_), v);
364 if (!was_empty.get()) {
365 penultimate_=&
this->prefront_;
366 }
else if (!v->next->next) {
367 penultimate_=v.get();
372 template<
class V,
class LkT>
374 slist<V, LkT>::move_penultimate(
typename node_details_t::base_t::atomic_ptr_t &node)
noexcept(
true) {
375 using ptr_t=
typename node_details_t::base_t::atomic_ptr_t;
376 assert(
dynamic_cast<
typename node_details_t::base_t::atomic_ptr_t::value_type>(node->next.get()));
377 node.assign([&node](ptr_t
const &) {
return node->next;});
378 assert(
dynamic_cast<
typename node_details_t::base_t::atomic_ptr_t::value_type>(node->next.get()));
381 template<
class V,
class LkT>
384 if (!
this->empty()) {
386 this->insert(penultimate_->next, v);
387 move_penultimate(penultimate_);
394 template<
class V,
class LkT>
397 if (!
this->empty()) {
399 this->insert(penultimate_->next, v);
400 move_penultimate(penultimate_);
407 template<
class V,
class LkT>
410 bool ret=
this->empty();
412 if (i.real_node.get()==penultimate_->next) {