mirror of
https://github.com/GTAmodding/re3.git
synced 2024-12-26 05:35:40 +00:00
130 lines
2.5 KiB
C++
130 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);
|
|
}
|
|
}
|
|
};
|