mirror of
https://github.com/ProjectDreamland/area51.git
synced 2024-11-01 11:11:47 +01:00
216 lines
4.5 KiB
C++
216 lines
4.5 KiB
C++
/*
|
|
|
|
ccList Class
|
|
|
|
*/
|
|
|
|
|
|
#ifndef CCLIST_H
|
|
#define CCLIST_H
|
|
|
|
|
|
#ifndef BOOL
|
|
#define BOOL int
|
|
#endif
|
|
#ifndef TRUE
|
|
#define TRUE 1
|
|
#endif
|
|
#ifndef FALSE
|
|
#define FALSE 0
|
|
#endif
|
|
#ifndef NULL
|
|
#define NULL 0
|
|
#endif
|
|
|
|
class ccMinNode;
|
|
class ccMinList;
|
|
class ccList;
|
|
class ccNode;
|
|
class ccHashNode;
|
|
|
|
#define LIST_MAGIC 0xABadCafe
|
|
|
|
|
|
class ccMinNode
|
|
{
|
|
protected:
|
|
ccMinNode *next, *prev;
|
|
|
|
public:
|
|
ccMinNode();
|
|
ccMinNode(const ccMinNode&);
|
|
virtual ~ccMinNode();
|
|
|
|
inline ccMinNode *GetNext(void) const { return next; }
|
|
inline ccMinNode *GetPrev(void) const { return prev; }
|
|
|
|
friend class ccMinList;
|
|
};
|
|
|
|
|
|
class ccNode : public ccMinNode
|
|
{
|
|
protected:
|
|
char *name;
|
|
unsigned long nameHash;
|
|
|
|
public:
|
|
ccNode();
|
|
virtual ~ccNode();
|
|
BOOL SetName(const char *theName);
|
|
|
|
inline const char *GetName(void) const { return(name); }
|
|
inline ccNode *GetNext(void) const { return (ccNode *)ccMinNode::GetNext(); }
|
|
inline ccNode *GetPrev(void) const { return (ccNode *)ccMinNode::GetPrev(); }
|
|
|
|
friend class ccList;
|
|
};
|
|
|
|
|
|
|
|
|
|
//*********************************************************************
|
|
|
|
typedef BOOL (*NodeCheckFlipFunc)(ccMinNode *n, ccMinNode *nn);
|
|
|
|
|
|
class ccMinList
|
|
{
|
|
private:
|
|
unsigned long numElements;
|
|
|
|
protected:
|
|
ccMinNode *head, *tail;
|
|
|
|
public:
|
|
ccMinList();
|
|
virtual ~ccMinList();
|
|
|
|
BOOL IsInList(ccMinNode *n) const;
|
|
|
|
ccMinNode *RemHead(void);
|
|
ccMinNode *RemTail(void);
|
|
ccMinNode *RemNode(ccMinNode *n);
|
|
|
|
long ElementNumber(ccMinNode *node);
|
|
|
|
inline ccMinNode *GetHead(void) const { return head; }
|
|
inline ccMinNode *GetTail(void) const { return tail; }
|
|
inline void AddHead(ccMinNode *n) { AddNode(0,n);}
|
|
|
|
inline void AddTail(ccMinNode *n) { AddNode(tail,n);}
|
|
void AddNode(ccMinNode *insertPoint, ccMinNode *n);
|
|
ccMinNode *FindNode(unsigned long ordinalnumber) const;
|
|
|
|
void Purge(void);
|
|
|
|
inline BOOL IsListEmpty() const {return(head ? 0 : 1);}
|
|
inline unsigned long GetNumElements() const { return(numElements); }
|
|
|
|
void Sort ( NodeCheckFlipFunc CheckFlip );
|
|
};
|
|
|
|
class ccList : public ccMinList
|
|
{
|
|
public:
|
|
ccList();
|
|
virtual ~ccList();
|
|
ccNode *FindNode(const char *name) const;
|
|
ccNode *FindNode(const char *name, ccNode *node) const;
|
|
inline ccNode *FindNode(unsigned long ordinalnumber) const
|
|
{ return (ccNode *)ccMinList::FindNode(ordinalnumber); }
|
|
|
|
void SortAlpha();
|
|
|
|
inline ccNode *GetHead(void) const { return (ccNode *)ccMinList::GetHead(); }
|
|
inline ccNode *GetTail(void) const { return (ccNode *)ccMinList::GetTail(); }
|
|
inline ccNode *RemHead(void) { return (ccNode *)ccMinList::RemHead(); }
|
|
inline ccNode *RemTail(void) { return (ccNode *)ccMinList::RemTail(); }
|
|
inline ccNode *RemNode(ccMinNode *n) { return(ccNode *)ccMinList::RemNode(n); }
|
|
};
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
// Hash values are maintained for faster searches
|
|
//-------------------------------------------------------------------
|
|
unsigned long CalcHash(const char *String);
|
|
|
|
class ccHashNodePtr;
|
|
class ccHashNode;
|
|
class ccHashList;
|
|
|
|
class ccHashNodePtr : public ccMinNode
|
|
{
|
|
private:
|
|
ccHashNode *NodePtr;
|
|
|
|
public:
|
|
inline ccHashNodePtr(ccHashNode *PointTo) {NodePtr = PointTo;}
|
|
inline ccHashNode *GetNodePtr(void) {return NodePtr;}
|
|
|
|
friend class ccHashList;
|
|
};
|
|
|
|
class ccHashNode : public ccMinNode
|
|
{
|
|
private:
|
|
char *Name;
|
|
|
|
unsigned long Hash;
|
|
ccHashNodePtr *myPtr;
|
|
|
|
|
|
protected:
|
|
public:
|
|
ccHashNode();
|
|
ccHashNode( ccHashNode& hashnode );
|
|
virtual ~ccHashNode();
|
|
|
|
BOOL SetName(const char *newName);
|
|
|
|
inline const char *GetName(void) const { return Name; }
|
|
|
|
inline ccHashNode *GetNext(void) const { return (ccHashNode *)ccMinNode::GetNext(); }
|
|
inline ccHashNode *GetPrev(void) const { return (ccHashNode *)ccMinNode::GetPrev(); }
|
|
|
|
friend class ccHashList;
|
|
};
|
|
|
|
|
|
class ccHashList
|
|
{
|
|
private:
|
|
long TableSize;
|
|
ccMinList *HashTable;
|
|
ccMinList NodeList;
|
|
|
|
void AddHashEntry(ccHashNode *n);
|
|
void RemHashEntry(ccHashNode *n);
|
|
|
|
protected:
|
|
public:
|
|
|
|
ccHashList();
|
|
ccHashList(long NewTableSize);
|
|
virtual ~ccHashList();
|
|
|
|
void SetTableSize(long NewTableSize);
|
|
inline long GetTableSize() const {return TableSize;}
|
|
|
|
void Purge(void);
|
|
|
|
void AddHead(ccHashNode *n);
|
|
void AddTail(ccHashNode *n);
|
|
void AddNode(ccHashNode *insertPoint, ccHashNode *n);
|
|
|
|
void RemNode(ccHashNode *n);
|
|
|
|
ccHashNode *Find(const char *FindName);
|
|
void Rename(ccHashNode *n, const char *NewName);
|
|
inline unsigned long GetNumElements(void) const {return NodeList.GetNumElements();}
|
|
|
|
inline ccHashNode *GetHead(void) const { return (ccHashNode *)NodeList.GetHead(); }
|
|
inline ccHashNode *GetTail(void) const { return (ccHashNode *)NodeList.GetTail(); }
|
|
};
|
|
|
|
#endif
|