re3-wiiu/src/core/Lists.h
2019-07-07 13:09:11 +02:00

131 lines
2.5 KiB
C++

#pragma once
class CPtrNode
{
public:
void *item;
CPtrNode *prev;
CPtrNode *next;
void *operator new(size_t);
void operator delete(void *p, size_t);
};
class CPtrList
{
public:
CPtrNode *first;
CPtrList(void) { first = nil; }
~CPtrList(void) { Flush(); }
CPtrNode *FindItem(void *item){
CPtrNode *node;
for(node = first; node; node = node->next)
if(node->item == item)
return node;
return nil;
}
CPtrNode *InsertNode(CPtrNode *node){
node->prev = nil;
node->next = first;
if(first)
first->prev = node;
first = node;
return node;
}
CPtrNode *InsertItem(void *item){
CPtrNode *node = new CPtrNode;
node->item = item;
InsertNode(node);
return node;
}
void RemoveNode(CPtrNode *node){
if(node == first)
first = node->next;
if(node->prev)
node->prev->next = node->next;
if(node->next)
node->next->prev = node->prev;
}
void DeleteNode(CPtrNode *node){
RemoveNode(node);
delete node;
}
void RemoveItem(void *item){
CPtrNode *node, *next;
for(node = first; node; node = next){
next = node->next;
if(node->item == item)
DeleteNode(node);
}
}
void Flush(void){
CPtrNode *node, *next;
for(node = first; node; node = next){
next = node->next;
DeleteNode(node);
}
}
};
class CSector;
// This records in which sector list a Physical is
class CEntryInfoNode
{
public:
CPtrList *list; // list in sector
CPtrNode *listnode; // node in list
CSector *sector;
CEntryInfoNode *prev;
CEntryInfoNode *next;
void *operator new(size_t);
void operator delete(void *p, size_t);
};
class CEntryInfoList
{
public:
CEntryInfoNode *first;
CEntryInfoList(void) { first = nil; }
~CEntryInfoList(void) { Flush(); }
CEntryInfoNode *InsertNode(CEntryInfoNode *node){
node->prev = nil;
node->next = first;
if(first)
first->prev = node;
first = node;
return node;
}
CEntryInfoNode *InsertItem(CPtrList *list, CPtrNode *listnode, CSector *sect){
CEntryInfoNode *node = new CEntryInfoNode;
node->list = list;
node->listnode = listnode;
node->sector = sect;
InsertNode(node);
return node;
}
void RemoveNode(CEntryInfoNode *node){
if(node == first)
first = node->next;
if(node->prev)
node->prev->next = node->next;
if(node->next)
node->next->prev = node->prev;
}
void DeleteNode(CEntryInfoNode *node){
RemoveNode(node);
delete node;
}
void Flush(void){
CEntryInfoNode *node, *next;
for(node = first; node; node = next){
next = node->next;
DeleteNode(node);
}
}
};