-
Notifications
You must be signed in to change notification settings - Fork 0
/
intrusive_list.cpp
55 lines (44 loc) · 1.05 KB
/
intrusive_list.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "intrusive_list.h"
intrusive::node::node(intrusive::node&& src) {
*this = std::move(src);
}
intrusive::node::~node() {
unlink();
}
intrusive::node& intrusive::node::operator=(intrusive::node&& src) {
if (this != &src) {
link(src.prev, src.next);
src.prev = nullptr;
src.next = nullptr;
}
return *this;
}
void intrusive::node::unlink() {
if (next == nullptr)
return;
next->prev = prev;
prev->next = next;
prev = nullptr;
next = nullptr;
}
void intrusive::node::link(intrusive::node* prev, intrusive::node* next) {
unlink();
this->prev = prev;
this->next = next;
prev->next = this;
next->prev = this;
}
void intrusive::node::splice(intrusive::node* first, intrusive::node* last) {
if (first == last) {
return;
}
three_swap(prev->next, first->prev->next, last->prev->next);
three_swap(prev, last->prev, first->prev);
}
void intrusive::node::three_swap(intrusive::node*& a, intrusive::node*& b,
intrusive::node*& c) {
node* tmp = a;
a = b;
b = c;
c = tmp;
}