2#ifdef USE_INITIALIZER_LIST
28 std::atomic<Node*>
next{
nullptr};
29 std::atomic<Node*>
prior{
nullptr};
41 if (
node !=
nullptr &&
owner !=
nullptr) {
42 Node* next_node =
node->
next.load(std::memory_order_acquire);
43 if (next_node !=
nullptr && next_node != &
owner->
last) {
68 if (
node !=
nullptr &&
owner !=
nullptr) {
69 Node* prior_node =
node->
prior.load(std::memory_order_acquire);
70 if (prior_node !=
nullptr && prior_node != &
owner->
first) {
120 inline operator bool()
const {
135 if (
owner !=
nullptr) {
137 for (
int j = 0; j < offset && tmp !=
nullptr; j++) {
138 Node* next_node = tmp->
next.load(std::memory_order_acquire);
139 if (next_node ==
nullptr || next_node == &
owner->
last) {
144 }
else if (offset < 0) {
145 for (
int j = 0; j < -offset && tmp !=
nullptr; j++) {
146 Node* prior_node = tmp->
prior.load(std::memory_order_acquire);
147 if (prior_node ==
nullptr || prior_node == &
owner->
first) {
169 Node* current = ref.
first.
next.load(std::memory_order_acquire);
170 while (current != &ref.
last) {
172 current = current->
next.load(std::memory_order_acquire);
180 for(
int i = 0; i < N; ++i) {
190 while (n !=
nullptr) {
191 Node* next = n->
next.load(std::memory_order_relaxed);
197#ifdef USE_INITIALIZER_LIST
200 for(
const auto &obj : iniList) {
211 if (
this == &ref)
return true;
215 Node* b_begin = ref.
first.
next.load(std::memory_order_relaxed);
216 Node* b_end = ref.
last.
prior.load(std::memory_order_relaxed);
217 bool a_empty = (a_begin == &
last);
218 bool b_empty = (b_begin == &ref.
last);
221 first.
next.store(b_empty ? &
last : b_begin, std::memory_order_relaxed);
222 last.
prior.store(b_empty ? &
first : b_end, std::memory_order_relaxed);
224 b_begin->
prior.store(&
first, std::memory_order_relaxed);
225 b_end->
next.store(&
last, std::memory_order_relaxed);
229 ref.
first.
next.store(a_empty ? &ref.
last : a_begin, std::memory_order_relaxed);
230 ref.
last.
prior.store(a_empty ? &ref.
first : a_end, std::memory_order_relaxed);
232 a_begin->
prior.store(&ref.
first, std::memory_order_relaxed);
233 a_end->
next.store(&ref.
last, std::memory_order_relaxed);
236 size_t a_count =
record_count.load(std::memory_order_relaxed);
237 size_t b_count = ref.
record_count.load(std::memory_order_relaxed);
239 ref.
record_count.store(a_count, std::memory_order_relaxed);
246 if (node ==
nullptr)
return false;
250 Node* old_last_prior =
last.
prior.load(std::memory_order_acquire);
253 node->
next.store(&
last, std::memory_order_relaxed);
254 node->
prior.store(old_last_prior, std::memory_order_relaxed);
258 if (old_last_prior->
next.compare_exchange_weak(
259 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
262 Node* expected_prior = old_last_prior;
264 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
271 old_last_prior->
next.store(&
last, std::memory_order_relaxed);
278 if (node ==
nullptr)
return false;
282 Node* old_first_next =
first.
next.load(std::memory_order_acquire);
285 node->
prior.store(&
first, std::memory_order_relaxed);
286 node->
next.store(old_first_next, std::memory_order_relaxed);
290 if (old_first_next->
prior.compare_exchange_weak(
291 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
294 Node* expected_next = old_first_next;
296 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
303 old_first_next->
prior.store(&
first, std::memory_order_relaxed);
310 if (node ==
nullptr)
return false;
314 if (current_node ==
nullptr)
return false;
317 Node* prior = current_node->
prior.load(std::memory_order_acquire);
318 if (prior ==
nullptr)
return false;
321 node->
prior.store(prior, std::memory_order_relaxed);
322 node->
next.store(current_node, std::memory_order_relaxed);
325 Node* expected_next = current_node;
326 if (prior->
next.compare_exchange_weak(
327 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
330 Node* expected_prior = prior;
331 if (current_node->
prior.compare_exchange_weak(
332 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
339 prior->
next.store(current_node, std::memory_order_relaxed);
356 Node* first_data =
first.
next.load(std::memory_order_acquire);
357 if (first_data == &
last)
return false;
359 Node* next_node = first_data->
next.load(std::memory_order_acquire);
360 data = first_data->
data;
364 first_data, next_node, std::memory_order_release, std::memory_order_relaxed)) {
366 if (next_node->
prior.compare_exchange_weak(
367 first_data, &
first, std::memory_order_release, std::memory_order_relaxed)) {
375 first.
next.store(first_data, std::memory_order_relaxed);
382 Node* last_data =
last.
prior.load(std::memory_order_acquire);
383 if (last_data == &
first)
return false;
385 Node* prior_node = last_data->
prior.load(std::memory_order_acquire);
386 data = last_data->
data;
390 last_data, prior_node, std::memory_order_release, std::memory_order_relaxed)) {
392 if (prior_node->
next.compare_exchange_weak(
393 last_data, &
last, std::memory_order_release, std::memory_order_relaxed)) {
401 last.
prior.store(last_data, std::memory_order_relaxed);
408 if (p_delete ==
nullptr || p_delete == &
first || p_delete == &
last) {
413 Node* prior_node = p_delete->
prior.load(std::memory_order_acquire);
414 Node* next_node = p_delete->
next.load(std::memory_order_acquire);
416 if (prior_node ==
nullptr || next_node ==
nullptr)
return false;
419 if (prior_node->
next.compare_exchange_weak(
420 p_delete, next_node, std::memory_order_release, std::memory_order_relaxed)) {
422 if (next_node->
prior.compare_exchange_weak(
423 p_delete, prior_node, std::memory_order_release, std::memory_order_relaxed)) {
431 prior_node->
next.store(p_delete, std::memory_order_relaxed);
441 Node* first_data =
first.
next.load(std::memory_order_acquire);
456 Node* last_data =
last.
prior.load(std::memory_order_acquire);
487 for (
int j = 0; j < index && n != &
last; j++) {
488 n = n->
next.load(std::memory_order_acquire);
505 Node* last_data =
last.
prior.load(std::memory_order_acquire);
511 Node* first_data =
first.
next.load(std::memory_order_acquire);
529 while (head !=
nullptr) {
530 Node* next = head->
next.load(std::memory_order_relaxed);
532 head, next, std::memory_order_acquire,
533 std::memory_order_relaxed)) {
534 head->
next.store(
nullptr, std::memory_order_relaxed);
535 head->
prior.store(
nullptr, std::memory_order_relaxed);
541 if (node !=
nullptr) {
570 if (p_delete ==
nullptr)
return;
573 p_delete->
next.store(old_head, std::memory_order_relaxed);
574 }
while (!
free_list.compare_exchange_weak(
575 old_head, p_delete, std::memory_order_release,
576 std::memory_order_relaxed));
584 if (p_delete !=
nullptr) {