368
|
1 /*!
|
|
2 MemList は空にならない。最低1個は要素が入っていて
|
|
3 1個目は特別扱いする。getFirst すると first->next を返す
|
|
4 */
|
369
|
5 #include <stdio.h>
|
|
6 #include "MemList.h"
|
368
|
7
|
|
8 /*!
|
|
9 最初の1個は特別扱いなので、それの後に追加していく
|
|
10 */
|
366
|
11 void
|
369
|
12 MemList::addFirst(MemorySegment* e)
|
366
|
13 {
|
368
|
14 e->prev = first;
|
|
15 e->next = first->next;
|
|
16 first->next->prev = e;
|
|
17 first->next = e;
|
366
|
18 }
|
|
19
|
|
20 void
|
369
|
21 MemList::addLast(MemorySegment* e)
|
366
|
22 {
|
368
|
23 e->next = first;
|
|
24 e->prev = last;
|
|
25 last->next = e;
|
366
|
26 last = e;
|
|
27 }
|
|
28
|
369
|
29 MemorySegment*
|
|
30 MemList::getFirst()
|
366
|
31 {
|
368
|
32 return first->next;
|
366
|
33 }
|
|
34
|
369
|
35 MemorySegment*
|
|
36 MemList::getLast()
|
366
|
37 {
|
368
|
38 return last;
|
366
|
39 }
|
|
40
|
368
|
41 int
|
369
|
42 MemList::remove(MemorySegment* e)
|
366
|
43 {
|
368
|
44 e->prev->next = e->next;
|
370
|
45 e->next->prev = e->prev;
|
|
46
|
|
47 if (first->next == e) {
|
|
48 first->next = e->next;
|
368
|
49 }
|
370
|
50 if (last == e) {
|
|
51 last = e->prev;
|
|
52 }
|
|
53
|
368
|
54 e->prev = NULL;
|
|
55 e->next = NULL;
|
|
56
|
|
57 return 1;
|
366
|
58 }
|
|
59
|
370
|
60 /*!
|
|
61 リストの先頭を取得および削除する。リストが空の場合は NULL を返す。
|
|
62 */
|
|
63
|
|
64 MemorySegment*
|
|
65 MemList::poll()
|
|
66 {
|
|
67 MemorySegment* e = first->next;
|
|
68 if (e == this) {
|
|
69 return NULL;
|
|
70 }
|
|
71 remove(e);
|
|
72 return e;
|
|
73 }
|
|
74
|
366
|
75 void
|
369
|
76 MemList::moveToFirst(MemorySegment* e)
|
366
|
77 {
|
|
78 remove(e);
|
|
79 addFirst(e);
|
|
80 }
|
370
|
81
|
|
82 /*!
|
|
83 リスト内の指定された位置にある要素を返す。
|
|
84 要素数を超えた位置を指定した場合 NULL を返す。
|
|
85 */
|
|
86
|
|
87 MemorySegment*
|
|
88 MemList::get(int index)
|
|
89 {
|
|
90 MemorySegment* e = first->next;
|
|
91 for (int i = 0; i < index; i++) {
|
|
92 if (e == this) return NULL;
|
|
93 e = e->next;
|
|
94 }
|
|
95 return e;
|
|
96 }
|