first commit
This commit is contained in:
130
src/Lists.h
Normal file
130
src/Lists.h
Normal file
@@ -0,0 +1,130 @@
|
||||
#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);
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user