3namespace Abstract::Memory {
5MEMList::MEMList() : MEMList(0) {}
8MEMList::MEMList(
u16 offset) {
9 m_headObject =
nullptr;
10 m_tailObject =
nullptr;
16void MEMList::append(
void *
object) {
20 setFirstObject(
object);
22 MEMLink *link = getLink(
object);
24 link->m_prevObject = m_tailObject;
25 link->m_nextObject =
nullptr;
27 getLink(m_tailObject)->m_nextObject = object;
28 m_tailObject = object;
34void MEMList::remove(
void *
object) {
37 MEMLink *link = getLink(
object);
39 if (!link->m_prevObject) {
40 m_headObject = link->m_nextObject;
42 getLink(link->m_prevObject)->m_nextObject = link->m_nextObject;
45 if (!link->m_nextObject) {
46 m_tailObject = link->m_prevObject;
48 getLink(link->m_nextObject)->m_prevObject = link->m_prevObject;
51 link->m_prevObject =
nullptr;
52 link->m_nextObject =
nullptr;
56void *MEMList::getFirst() {
57 return getNext(
nullptr);
61void *MEMList::getNext(
void *
object) {
62 return object ? getLink(
object)->m_nextObject : m_headObject;
65void MEMList::setFirstObject(
void *
object) {
68 MEMLink *link = getLink(
object);
70 link->m_nextObject =
nullptr;
71 link->m_prevObject =
nullptr;
73 m_headObject = object;
74 m_tailObject = object;
78MEMLink *MEMList::getLink(
void *
object) {
79 return reinterpret_cast<MEMLink *
>(GetAddrNum(
object) + m_offset);