A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
List.cc
1#include "List.hh"
2
3namespace Abstract::Memory {
4
5MEMList::MEMList() : MEMList(0) {}
6
8MEMList::MEMList(u16 offset) {
9 m_headObject = nullptr;
10 m_tailObject = nullptr;
11 m_numObjects = 0;
12 m_offset = offset;
13}
14
16void MEMList::append(void *object) {
17 ASSERT(object);
18
19 if (!m_headObject) {
20 setFirstObject(object);
21 } else {
22 MEMLink *link = getLink(object);
23
24 link->m_prevObject = m_tailObject;
25 link->m_nextObject = nullptr;
26
27 getLink(m_tailObject)->m_nextObject = object;
28 m_tailObject = object;
29 ++m_numObjects;
30 }
31}
32
34void MEMList::remove(void *object) {
35 ASSERT(object);
36
37 MEMLink *link = getLink(object);
38
39 if (!link->m_prevObject) {
40 m_headObject = link->m_nextObject;
41 } else {
42 getLink(link->m_prevObject)->m_nextObject = link->m_nextObject;
43 }
44
45 if (!link->m_nextObject) {
46 m_tailObject = link->m_prevObject;
47 } else {
48 getLink(link->m_nextObject)->m_prevObject = link->m_prevObject;
49 }
50
51 link->m_prevObject = nullptr;
52 link->m_nextObject = nullptr;
53 --m_numObjects;
54}
55
56void *MEMList::getFirst() {
57 return getNext(nullptr);
58}
59
61void *MEMList::getNext(void *object) {
62 return object ? getLink(object)->m_nextObject : m_headObject;
63}
64
65void MEMList::setFirstObject(void *object) {
66 ASSERT(object);
67
68 MEMLink *link = getLink(object);
69
70 link->m_nextObject = nullptr;
71 link->m_prevObject = nullptr;
72
73 m_headObject = object;
74 m_tailObject = object;
75 ++m_numObjects;
76}
77
78MEMLink *MEMList::getLink(void *object) {
79 return reinterpret_cast<MEMLink *>(GetAddrNum(object) + m_offset);
80}
81
82} // namespace Abstract::Memory