...
Source file src/pkg/container/list/list.go
1
2
3
4
5
6
7
8
9
10
11
12 package list
13
14
15 type Element struct {
16
17
18
19
20
21 next, prev *Element
22
23
24 list *List
25
26
27 Value interface{}
28 }
29
30
31 func (e *Element) Next() *Element {
32 if p := e.next; e.list != nil && p != &e.list.root {
33 return p
34 }
35 return nil
36 }
37
38
39 func (e *Element) Prev() *Element {
40 if p := e.prev; e.list != nil && p != &e.list.root {
41 return p
42 }
43 return nil
44 }
45
46
47
48 type List struct {
49 root Element
50 len int
51 }
52
53
54 func (l *List) Init() *List {
55 l.root.next = &l.root
56 l.root.prev = &l.root
57 l.len = 0
58 return l
59 }
60
61
62 func New() *List { return new(List).Init() }
63
64
65
66 func (l *List) Len() int { return l.len }
67
68
69 func (l *List) Front() *Element {
70 if l.len == 0 {
71 return nil
72 }
73 return l.root.next
74 }
75
76
77 func (l *List) Back() *Element {
78 if l.len == 0 {
79 return nil
80 }
81 return l.root.prev
82 }
83
84
85 func (l *List) lazyInit() {
86 if l.root.next == nil {
87 l.Init()
88 }
89 }
90
91
92 func (l *List) insert(e, at *Element) *Element {
93 n := at.next
94 at.next = e
95 e.prev = at
96 e.next = n
97 n.prev = e
98 e.list = l
99 l.len++
100 return e
101 }
102
103
104 func (l *List) insertValue(v interface{}, at *Element) *Element {
105 return l.insert(&Element{Value: v}, at)
106 }
107
108
109 func (l *List) remove(e *Element) *Element {
110 e.prev.next = e.next
111 e.next.prev = e.prev
112 e.next = nil
113 e.prev = nil
114 e.list = nil
115 l.len--
116 return e
117 }
118
119
120 func (l *List) move(e, at *Element) *Element {
121 if e == at {
122 return e
123 }
124 e.prev.next = e.next
125 e.next.prev = e.prev
126
127 n := at.next
128 at.next = e
129 e.prev = at
130 e.next = n
131 n.prev = e
132
133 return e
134 }
135
136
137
138
139 func (l *List) Remove(e *Element) interface{} {
140 if e.list == l {
141
142
143 l.remove(e)
144 }
145 return e.Value
146 }
147
148
149 func (l *List) PushFront(v interface{}) *Element {
150 l.lazyInit()
151 return l.insertValue(v, &l.root)
152 }
153
154
155 func (l *List) PushBack(v interface{}) *Element {
156 l.lazyInit()
157 return l.insertValue(v, l.root.prev)
158 }
159
160
161
162
163 func (l *List) InsertBefore(v interface{}, mark *Element) *Element {
164 if mark.list != l {
165 return nil
166 }
167
168 return l.insertValue(v, mark.prev)
169 }
170
171
172
173
174 func (l *List) InsertAfter(v interface{}, mark *Element) *Element {
175 if mark.list != l {
176 return nil
177 }
178
179 return l.insertValue(v, mark)
180 }
181
182
183
184
185 func (l *List) MoveToFront(e *Element) {
186 if e.list != l || l.root.next == e {
187 return
188 }
189
190 l.move(e, &l.root)
191 }
192
193
194
195
196 func (l *List) MoveToBack(e *Element) {
197 if e.list != l || l.root.prev == e {
198 return
199 }
200
201 l.move(e, l.root.prev)
202 }
203
204
205
206
207 func (l *List) MoveBefore(e, mark *Element) {
208 if e.list != l || e == mark || mark.list != l {
209 return
210 }
211 l.move(e, mark.prev)
212 }
213
214
215
216
217 func (l *List) MoveAfter(e, mark *Element) {
218 if e.list != l || e == mark || mark.list != l {
219 return
220 }
221 l.move(e, mark)
222 }
223
224
225
226 func (l *List) PushBackList(other *List) {
227 l.lazyInit()
228 for i, e := other.Len(), other.Front(); i > 0; i, e = i-1, e.Next() {
229 l.insertValue(e.Value, l.root.prev)
230 }
231 }
232
233
234
235 func (l *List) PushFrontList(other *List) {
236 l.lazyInit()
237 for i, e := other.Len(), other.Back(); i > 0; i, e = i-1, e.Prev() {
238 l.insertValue(e.Value, &l.root)
239 }
240 }
241
View as plain text