mirror of
https://github.com/zeldaret/st
synced 2026-05-31 01:15:44 -04:00
530fcd8c07
* remove scratch links * UnkAdventureModeSystem1 OK * UnkStruct_ov024_020d8694_024 OK * UnkTitleCardSystem1_024 99% * UnkTitleCardSystem1_024 OK * fix regressions * title card vfunc_08 oddity * tools: make build.ninja deterministic and delink when objdiff rebuild-on-change * clean up link node mess * UnkStruct_020d8698_024 24% * UnkStruct_020d8698_024 49% * UnkStruct_020d8698_024 65% * fix build issues * UnkStruct_020d8698_024 92% * UnkStruct_020d8698_024 OK * delink data_ov024_020d8694 symbol * tools: revert previous objdiff change and reduce ds-rom logs on objdiff
202 lines
4.2 KiB
C++
202 lines
4.2 KiB
C++
#pragma once
|
|
|
|
#include "types.h"
|
|
|
|
//! TODO: inlines in the class
|
|
#define GetLinkListRef(l) (&l)
|
|
#define GetLinkListOrigin(l) GetLinkListRef(l)
|
|
|
|
class LinkListNode {
|
|
private:
|
|
/* 00 */ LinkListNode *mpNext;
|
|
/* 04 */ LinkListNode *mpPrev;
|
|
/* 08 */
|
|
|
|
public:
|
|
LinkListNode *GetNext() {
|
|
return this->mpNext;
|
|
}
|
|
|
|
LinkListNode *GetPrev() {
|
|
return this->mpPrev;
|
|
}
|
|
|
|
void SetNext(LinkListNode *pNext) {
|
|
this->mpNext = pNext;
|
|
}
|
|
|
|
void SetPrev(LinkListNode *pPrev) {
|
|
this->mpPrev = pPrev;
|
|
}
|
|
};
|
|
|
|
class LinkListIterImpl {
|
|
private:
|
|
LinkListNode *mPointer;
|
|
|
|
public:
|
|
LinkListIterImpl(LinkListNode *pNode) {
|
|
this->mPointer = pNode;
|
|
}
|
|
|
|
LinkListNode *operator->() {
|
|
return this->mPointer;
|
|
}
|
|
|
|
LinkListNode &operator*() {
|
|
return *this->mPointer;
|
|
}
|
|
|
|
LinkListIterImpl &operator++() {
|
|
this->mPointer = (LinkListNode *) ((u8 *) this->mPointer + 4);
|
|
return *this;
|
|
}
|
|
|
|
LinkListIterImpl &operator++(int) {
|
|
this->mPointer = this->mPointer->GetNext();
|
|
return *this;
|
|
}
|
|
|
|
LinkListIterImpl &operator--(int) {
|
|
this->mPointer = mPointer->GetPrev();
|
|
return *this;
|
|
}
|
|
|
|
friend bool operator==(LinkListIterImpl &left, LinkListNode *right) {
|
|
return left.mPointer == right;
|
|
}
|
|
|
|
friend bool operator!=(LinkListIterImpl &left, LinkListNode *right) {
|
|
return left.mPointer != right;
|
|
}
|
|
};
|
|
|
|
class LinkListImpl : public LinkListNode {
|
|
public:
|
|
/* 00 (base) */
|
|
/* 08 */
|
|
|
|
public:
|
|
LinkListImpl();
|
|
~LinkListImpl();
|
|
|
|
LinkListNode *GetOriginNode() {
|
|
return (LinkListNode *) this;
|
|
}
|
|
|
|
LinkListNode *GetBeginIterImpl() {
|
|
return this->GetNext();
|
|
}
|
|
|
|
LinkListNode *GetEndIterImpl() {
|
|
return this;
|
|
}
|
|
|
|
// insert B (`node`) between A (`this`) and C (`this->mNext`)
|
|
void Append(LinkListNode *node);
|
|
|
|
// insert B (`node`) between A (`this->mPrev`) and C (`this`)
|
|
void Prepend(LinkListNode *node);
|
|
|
|
// links list `node` to list `this` (append)
|
|
void Extend(LinkListNode *node);
|
|
|
|
// returns the number of how many nodes are following `this`
|
|
s32 GetListLength();
|
|
|
|
// search through the list to determine if the node is inside it
|
|
bool Contains(LinkListNode *node);
|
|
|
|
static void Detach(LinkListNode *pNode);
|
|
};
|
|
|
|
#define GetBeginIter(l) (GetLinkListRef(l)->GetNextTarget())
|
|
#define GetBeginIterReverse(l) (GetLinkListRef(l)->GetPrevTarget())
|
|
#define GetEndIter(l) GetLinkListRef(l)
|
|
#define GetNextIter(it) (it = it->GetNextTarget())
|
|
#define GetPrevIter(it) (it = it->GetPrevTarget())
|
|
|
|
template <typename T> class LinkListIter {
|
|
private:
|
|
T *mPointer;
|
|
|
|
public:
|
|
LinkListIter() {}
|
|
|
|
LinkListIter(T *pNode) {
|
|
this->mPointer = pNode;
|
|
}
|
|
|
|
T *operator->() const {
|
|
return this->mPointer;
|
|
}
|
|
|
|
T &operator*() const {
|
|
return *this->mPointer;
|
|
}
|
|
|
|
void operator++() {
|
|
this->mPointer = (T *) ((u8 *) this->mPointer + 4);
|
|
}
|
|
|
|
void operator++(int) {
|
|
this->mPointer = this->mPointer->GetNextTarget();
|
|
}
|
|
|
|
void operator--(int) {
|
|
this->mPointer = mPointer->GetPrevTarget();
|
|
}
|
|
|
|
friend const bool operator==(LinkListIter &left, T *right) {
|
|
return left.mPointer == right;
|
|
}
|
|
|
|
friend const bool operator!=(LinkListIter &left, T *right) {
|
|
return left.mPointer != right;
|
|
}
|
|
|
|
friend const bool operator==(LinkListIter &left, T &right) {
|
|
return left.mPointer == &right;
|
|
}
|
|
|
|
friend const bool operator!=(LinkListIter &left, T &right) {
|
|
return left.mPointer != &right;
|
|
}
|
|
};
|
|
|
|
template <typename T> class LinkList : public LinkListImpl {
|
|
private:
|
|
/* 00 (base) */
|
|
/* 08 */
|
|
|
|
public:
|
|
LinkList() {}
|
|
~LinkList() {}
|
|
|
|
LinkListNode *GetNextNode() {
|
|
return this->GetNext();
|
|
}
|
|
|
|
LinkListNode *GetPrevNode() {
|
|
return this->GetPrev();
|
|
}
|
|
|
|
T *GetNextTarget() {
|
|
return (T *) this->GetNextNode();
|
|
}
|
|
|
|
T *GetPrevTarget() {
|
|
return (T *) this->GetPrevNode();
|
|
}
|
|
|
|
T *GetRef() {
|
|
return (T *) this;
|
|
}
|
|
|
|
void Detach() {
|
|
LinkListImpl::Detach(this);
|
|
}
|
|
|
|
typedef LinkListIter<T> Iterator;
|
|
};
|