182 lines
3.6 KiB
C++
182 lines
3.6 KiB
C++
#ifndef N_LIST_H
|
|
#define N_LIST_H
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
@brief Implement a doubly linked list.
|
|
|
|
@author
|
|
- RadonLabs GmbH
|
|
|
|
@since
|
|
- 2005.6.30
|
|
@remarks
|
|
- Áö¿Ï Ãß°¡
|
|
*/
|
|
|
|
|
|
#include "../ProgramCommon/Define.h"
|
|
#include "nnode.h"
|
|
|
|
//------------------------------------------------------------------------------
|
|
class nList
|
|
{
|
|
public:
|
|
/// constructor
|
|
nList();
|
|
/// destructor (list must be empty!)
|
|
~nList();
|
|
/// checks if list is empty
|
|
bool IsEmpty() const;
|
|
/// returns first node in list, 0 if empty
|
|
nNode* GetHead() const;
|
|
/// returns last node in list, 0 if empty
|
|
nNode* GetTail() const;
|
|
/// add node to head of list
|
|
void AddHead(nNode* n);
|
|
/// add node to end of list
|
|
void AddTail(nNode* n);
|
|
/// remove node from head of list
|
|
nNode* RemHead();
|
|
/// remove node from tail of list
|
|
nNode* RemTail();
|
|
|
|
private:
|
|
nNode* head;
|
|
nNode* tail;
|
|
nNode* tailpred;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
inline
|
|
nList::nList()
|
|
{
|
|
this->head = (nNode *) &(this->tail);
|
|
this->tail = 0;
|
|
this->tailpred = (nNode *) &(this->head);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
Destroy list object. The list has to be empty, otherwise an assertion
|
|
will be thrown.
|
|
*/
|
|
inline nList::~nList()
|
|
{
|
|
ASSERT(0 == this->head->succ);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
@return true if list is empty.
|
|
*/
|
|
inline
|
|
bool
|
|
nList::IsEmpty() const
|
|
{
|
|
return (this->head->succ == 0);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
@return return first node in list, or 0 if list is empty
|
|
*/
|
|
inline
|
|
nNode*
|
|
nList::GetHead() const
|
|
{
|
|
if (this->head->succ)
|
|
{
|
|
return this->head;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
@return return last node in list, or 0 if list is empty
|
|
*/
|
|
inline
|
|
nNode*
|
|
nList::GetTail() const
|
|
{
|
|
if (this->tailpred->pred)
|
|
{
|
|
return this->tailpred;
|
|
}
|
|
else
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
@param n the node to be added
|
|
*/
|
|
inline
|
|
void
|
|
nList::AddHead(nNode *n)
|
|
{
|
|
n->InsertAfter((nNode *) &(this->head));
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
@param n the node to be added
|
|
*/
|
|
inline
|
|
void
|
|
nList::AddTail(nNode *n)
|
|
{
|
|
n->InsertBefore((nNode *) &(this->tail));
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
Remove node at head of list, and return pointer to it. Returns 0 if
|
|
list is empty.
|
|
|
|
@return the removed node or 0 if list is empty
|
|
*/
|
|
inline nNode *nList::RemHead()
|
|
{
|
|
nNode *n = this->head;
|
|
if (n->succ)
|
|
{
|
|
n->Remove();
|
|
return n;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/**
|
|
Remove node at tail of list, and return pointer to it. Returns 0 if
|
|
list is empty.
|
|
|
|
@return the removed node or 0 if list is empty
|
|
*/
|
|
inline nNode *nList::RemTail()
|
|
{
|
|
nNode *n = this->tailpred;
|
|
if (n->pred)
|
|
{
|
|
n->Remove();
|
|
return n;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
//--------------------------------------------------------------------
|
|
#endif
|