2#ifdef USE_INITIALIZER_LIST
28 std::atomic<Node*>
next{
nullptr};
29 std::atomic<Node*>
prior{
nullptr};
41 if (
node !=
nullptr) {
42 Node* next_node =
node->
next.load(std::memory_order_acquire);
43 if (next_node !=
nullptr && next_node != &
owner->
last) {
60 if (
node !=
nullptr) {
61 Node* prior_node =
node->
prior.load(std::memory_order_acquire);
62 if (prior_node !=
nullptr && prior_node != &
owner->
first) {
106 inline operator bool()
const {
122 for (
int j = 0; j < offset && tmp !=
nullptr; j++) {
123 Node* next_node = tmp->
next.load(std::memory_order_acquire);
124 if (next_node ==
nullptr || next_node == &
owner->
last) {
129 }
else if (offset < 0) {
130 for (
int j = 0; j < -offset && tmp !=
nullptr; j++) {
131 Node* prior_node = tmp->
prior.load(std::memory_order_acquire);
132 if (prior_node ==
nullptr || prior_node == &
owner->
first) {
153 Node* current = ref.
first.
next.load(std::memory_order_acquire);
154 while (current != &ref.
last) {
156 current = current->
next.load(std::memory_order_acquire);
164 for(
int i = 0; i < N; ++i) {
173#ifdef USE_INITIALIZER_LIST
176 for(
const auto &obj : iniList) {
190 if (node ==
nullptr)
return false;
194 Node* old_last_prior =
last.
prior.load(std::memory_order_acquire);
197 node->
next.store(&
last, std::memory_order_relaxed);
198 node->
prior.store(old_last_prior, std::memory_order_relaxed);
202 if (old_last_prior->
next.compare_exchange_weak(
203 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
206 Node* expected_prior = old_last_prior;
208 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
215 old_last_prior->
next.store(&
last, std::memory_order_relaxed);
222 if (node ==
nullptr)
return false;
226 Node* old_first_next =
first.
next.load(std::memory_order_acquire);
229 node->
prior.store(&
first, std::memory_order_relaxed);
230 node->
next.store(old_first_next, std::memory_order_relaxed);
234 if (old_first_next->
prior.compare_exchange_weak(
235 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
238 Node* expected_next = old_first_next;
240 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
247 old_first_next->
prior.store(&
first, std::memory_order_relaxed);
254 if (node ==
nullptr)
return false;
258 if (current_node ==
nullptr)
return false;
261 Node* prior = current_node->
prior.load(std::memory_order_acquire);
262 if (prior ==
nullptr)
return false;
265 node->
prior.store(prior, std::memory_order_relaxed);
266 node->
next.store(current_node, std::memory_order_relaxed);
269 Node* expected_next = current_node;
270 if (prior->
next.compare_exchange_weak(
271 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
274 Node* expected_prior = prior;
275 if (current_node->
prior.compare_exchange_weak(
276 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
283 prior->
next.store(current_node, std::memory_order_relaxed);
300 Node* first_data =
first.
next.load(std::memory_order_acquire);
301 if (first_data == &
last)
return false;
303 Node* next_node = first_data->
next.load(std::memory_order_acquire);
304 data = first_data->
data;
308 first_data, next_node, std::memory_order_release, std::memory_order_relaxed)) {
310 if (next_node->
prior.compare_exchange_weak(
311 first_data, &
first, std::memory_order_release, std::memory_order_relaxed)) {
319 first.
next.store(first_data, std::memory_order_relaxed);
326 Node* last_data =
last.
prior.load(std::memory_order_acquire);
327 if (last_data == &
first)
return false;
329 Node* prior_node = last_data->
prior.load(std::memory_order_acquire);
330 data = last_data->
data;
334 last_data, prior_node, std::memory_order_release, std::memory_order_relaxed)) {
336 if (prior_node->
next.compare_exchange_weak(
337 last_data, &
last, std::memory_order_release, std::memory_order_relaxed)) {
345 last.
prior.store(last_data, std::memory_order_relaxed);
352 if (p_delete ==
nullptr || p_delete == &
first || p_delete == &
last) {
357 Node* prior_node = p_delete->
prior.load(std::memory_order_acquire);
358 Node* next_node = p_delete->
next.load(std::memory_order_acquire);
360 if (prior_node ==
nullptr || next_node ==
nullptr)
return false;
363 if (prior_node->
next.compare_exchange_weak(
364 p_delete, next_node, std::memory_order_release, std::memory_order_relaxed)) {
366 if (next_node->
prior.compare_exchange_weak(
367 p_delete, prior_node, std::memory_order_release, std::memory_order_relaxed)) {
375 prior_node->
next.store(p_delete, std::memory_order_relaxed);
381 Node* first_data =
first.
next.load(std::memory_order_acquire);
382 Iterator it(first_data == &
last ?
nullptr : first_data);
394 Node* last_data =
last.
prior.load(std::memory_order_acquire);
425 for (
int j = 0; j < index && n != &
last; j++) {
426 n = n->
next.load(std::memory_order_acquire);
441 Node* last_data =
last.
prior.load(std::memory_order_acquire);
447 Node* first_data =
first.
next.load(std::memory_order_acquire);
460 if (node !=
nullptr) {
471 if (p_delete !=
nullptr) {