28 std::atomic<Node*> next{
nullptr};
29 std::atomic<Node*> prior{
nullptr};
33 Node(
const T& value) : data(value) {}
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) {
78 inline Iterator operator+(
int offset) {
79 return getIteratorAtOffset(offset);
82 inline Iterator operator-(
int offset) {
83 return getIteratorAtOffset(-offset);
86 inline bool operator==(
const Iterator& it)
const {
87 return node == it.node;
90 inline bool operator!=(
const Iterator& it)
const {
91 return node != it.node;
94 inline T& operator*() {
98 inline T* operator->() {
102 inline Node* get_node() {
106 inline operator bool()
const {
115 Node* node =
nullptr;
119 Iterator getIteratorAtOffset(
int offset) {
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) {
155 push_back(current->data);
156 current = current->next.load(std::memory_order_acquire);
164 for(
int i = 0; i < N; ++i) {
173#ifdef USE_INITIALIZER_LIST
174 ListLockFree(std::initializer_list<T> iniList, Allocator &allocator = DefaultAllocator) : p_allocator(&allocator) {
176 for(
const auto &obj : iniList) {
182 bool swap(ListLockFree<T>& ref) {
188 bool push_back(
const T& data) {
189 Node* node = createNode();
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);
201 Node* expected_next = &last;
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;
207 if (last.prior.compare_exchange_weak(
208 expected_prior, node, std::memory_order_release, std::memory_order_relaxed)) {
210 record_count.fetch_add(1, std::memory_order_relaxed);
215 old_last_prior->next.store(&last, std::memory_order_relaxed);
220 bool push_front(
const T& data) {
221 Node* node = createNode();
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);
233 Node* expected_prior = &first;
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;
239 if (first.next.compare_exchange_weak(
240 expected_next, node, std::memory_order_release, std::memory_order_relaxed)) {
242 record_count.fetch_add(1, std::memory_order_relaxed);
247 old_first_next->prior.store(&first, std::memory_order_relaxed);
252 bool insert(Iterator it,
const T& data) {
253 Node* node = createNode();
254 if (node ==
nullptr)
return false;
257 Node* current_node = it.get_node();
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)) {
278 record_count.fetch_add(1, std::memory_order_relaxed);
283 prior->next.store(current_node, std::memory_order_relaxed);
290 return pop_front(tmp);
295 return pop_back(tmp);
298 bool pop_front(T& data) {
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;
307 if (first.next.compare_exchange_weak(
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)) {
313 deleteNode(first_data);
314 record_count.fetch_sub(1, std::memory_order_relaxed);
319 first.next.store(first_data, std::memory_order_relaxed);
324 bool pop_back(T& data) {
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;
333 if (last.prior.compare_exchange_weak(
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)) {
339 deleteNode(last_data);
340 record_count.fetch_sub(1, std::memory_order_relaxed);
345 last.prior.store(last_data, std::memory_order_relaxed);
350 bool erase(Iterator it) {
351 Node* p_delete = it.get_node();
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)) {
369 deleteNode(p_delete);
370 record_count.fetch_sub(1, 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);
395 Iterator it(last_data == &first ?
nullptr : last_data);
407 return record_count.load(std::memory_order_relaxed);
415 while (pop_front()) {
421 inline T& operator[](
int index) {
424 Node* n = first.next.load(std::memory_order_acquire);
425 for (
int j = 0; j < index && n != &last; j++) {
426 n = n->next.load(std::memory_order_acquire);
432 return n != &last ? n->data : last.data;
435 void setAllocator(Allocator& allocator) {
436 p_allocator = &allocator;
441 Node* last_data = last.prior.load(std::memory_order_acquire);
442 return last_data != &first ? last_data->data : last.data;
447 Node* first_data = first.next.load(std::memory_order_acquire);
448 return first_data != &last ? first_data->data : first.data;
454 std::atomic<size_t> record_count{0};
455 Allocator* p_allocator = &DefaultAllocator;
459 Node* node = (Node*) p_allocator->allocate(
sizeof(Node));
460 if (node !=
nullptr) {
464 Node* node =
new Node();
469 void deleteNode(Node* p_delete) {
471 if (p_delete !=
nullptr) {
473 p_allocator->free(p_delete);
481 first.next.store(&last, std::memory_order_relaxed);
482 last.prior.store(&first, std::memory_order_relaxed);
485 friend class Iterator;