📄 utlist.h
字号:
// @cmember Assignment operator
// virtual UTListIterator< T >& operator = (const UTListIterator< T >& AssignListItr);
// @cmember Move the iterator to the previous link
virtual BOOL operator -- (int dummy);
// @cmember Remove the current link from the list
virtual BOOL RemoveCurrent (UTLink<T> ** ppLink);
// @cmember Insert a new value before the iterator
// virtual void InsertBefore (UTLink<T> * pLink);
// @cmember Insert a new value after the iterator
// virtual void InsertAfter (UTLink<T> * pLink);
// @cmember Set the iterator at the first element of this value
virtual BOOL SetPosAt (const T& Value);
// @access Protected members
public:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// data members
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @cmember Position of iterator in list
UTLink< T > * m_pCurrentLink;
// @cmember One position before the current position
UTLink< T > * m_pPreviousLink;
// @cmember List that is being iterated upon
UTStaticList< T >& m_StaticList;
}; //End UTStaticListIterator
//---------- Inline Functions -----------------------------------------------
//---------------------------------------------------------------------------
// @mfunc Constructors
//
// @tcarg None.
//
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTLink< T >::UTLink
(
void
)
{
// do nothing
m_pPrevLink = NULL;
m_pNextLink = NULL;
}
//---------------------------------------------------------------------------
// @mfunc Constructors
//
// @tcarg class | T | data type to store in the link
//
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTLink< T >::UTLink(
const T& LinkValue, // @parm [in] Value to be stored with link
UTLink< T > * Prev, // @parm [in] pointer to previous link
UTLink< T > * Next // @parm [in] pointer to next link
)
: m_Value(LinkValue),
m_pPrevLink(Prev),
m_pNextLink(Next)
{
// do nothing
}
//---------------------------------------------------------------------------
// @tcarg class | T | data type to store in the link
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTLink< T >::UTLink(
const UTLink< T >& CopyLink // @parm [in] value to copy into this object
)
{
m_Value = CopyLink.m_Value;
m_pPrevLink = CopyLink.m_pPrevLink;
m_pNextLink = CopyLink.m_pNextLink;
}
//---------------------------------------------------------------------------
// @mfunc This is the destructor. Currently, it does nothing.
//
// @tcarg class | T | data type to store in the link
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTLink< T >::~UTLink(
void
)
{
// do nothing
}
//---------------------------------------------------------------------------
// @mfunc This is the assignment operator for <c UTLink>.
//
// @tcarg class | T | data type to store in the link
//
// @rdesc Returns a reference to the newly assigned object
//
//---------------------------------------------------------------------------
template <class T> void UTLink<T>::Init
(
const T& LinkValue,UTLink< T > * Prev, UTLink< T > * Next
)
{
m_Value = LinkValue;
m_pPrevLink = Prev;
m_pNextLink = Next;
}
//---------------------------------------------------------------------------
// @mfunc This is the assignment operator for <c UTLink>.
//
// @tcarg class | T | data type to store in the link
//
// @rdesc Returns a reference to the newly assigned object
//
//---------------------------------------------------------------------------
template <class T> UTLink< T >& UTLink< T >::operator =(
const UTLink< T >& AssignLink // @parm [in] value to assign into this object
)
{
m_Value = AssignLink.m_Value;
m_pPrevLink = AssignLink.m_pPrevLink;
m_pNextLink = AssignLink.m_pNextLink;
return *this;
}
//---------------------------------------------------------------------------
// @mfunc This method takes a value of type T and creates a new link
// containing that value. It fixes all pointers surrounding the
// current link so that it assumes the position just before the
// current link. It then returns the new link pointer.
//
// @tcarg class | T | data type to store in the link
//
// @rdesc Pointer to the newly added link
//
//---------------------------------------------------------------------------
template <class T> UTLink< T > * UTLink< T >::AddBefore(
const T& newValue // @parm [in] Value for new link just after the current link
)
{
// allocate memory for new link
UTLink< T > * newLink;
newLink = new UTLink< T >(newValue, m_pPrevLink, this);
if (newLink)
{
// if this isn't front of list, have old prev link point to new link
if (m_pPrevLink)
{
m_pPrevLink->m_pNextLink = newLink;
}
// make sure this link points back to new link added just before it
m_pPrevLink = newLink;
}
else
throw ( EXCEPT_MEMORY );
return (newLink);
}
//---------------------------------------------------------------------------
// @mfunc This method takes a value of type T and creates a new link
// containing that value. It fixes all pointers surrounding the
// current link so that it assumes the position just after the
// current link. It then returns the new link pointer.
//
// @tcarg class | T | data type to store in the link
//
// @rdesc Pointer to the newly added link
//
//---------------------------------------------------------------------------
template <class T> UTLink< T > * UTLink< T >::AddAfter(
const T& newValue // @parm [in] Value for new link just after the current link
)
{
// allocate memory for new link
UTLink< T > * newLink;
newLink = new UTLink< T >(newValue, this, m_pNextLink);
if (newLink)
{
// if this isn't end of list, have old next link point back to new link
if (m_pNextLink)
{
m_pNextLink->m_pPrevLink = newLink;
}
// make sure this link points forward to new link added just after it
m_pNextLink = newLink;
}
else
throw (EXCEPT_MEMORY);
return (newLink);
}
//---------------------------------------------------------------------------
// @mfunc This method takes a pointer to a static list and removes this
// link from the list.
//
// @tcarg class | T | data type stored in the link
//
// @rdesc none
//
//---------------------------------------------------------------------------
template <class T> void UTLink< T >::RemoveFromList (
UTStaticList < T > * pStaticList)
{
if ((m_pPrevLink == 0x0 ) && (m_pNextLink == 0x0))
{
pStaticList->m_pLastLink = 0x0;
pStaticList->m_pFirstLink = 0x0;
}
else if (m_pPrevLink == 0x0 )
{
pStaticList->m_pFirstLink = m_pNextLink;
}
else if (m_pNextLink == 0x0 )
{
pStaticList->m_pLastLink = m_pPrevLink;
}
else
{
m_pNextLink->m_pPrevLink = m_pPrevLink;
m_pPrevLink->m_pNextLink = m_pNextLink;
}
m_pNextLink = 0x0;
m_pPrevLink = 0x0;
// Update the number of link objects in the list
pStaticList->m_ulCount--;
} // End RemoveFromList
//---------------------------------------------------------------------------
// @mfunc Constructors
//
// @tcarg class | T | data type to store in the list
//
// @syntax UTList< T >::UTList()
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTList< T >::UTList(
void
)
: m_ulCount(0), m_pFirstLink(NULL), m_pLastLink(NULL)
{
// do nothing
}
//---------------------------------------------------------------------------
// @tcarg class | T | data type to store in the list
//
// @syntax UTList< T >::UTList(const UTList< T >&)
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTList< T >::UTList(
const UTList< T >& CopyList // @parm [in] list to be copied
)
{
UTListIterator< T > itr((UTList< T >&)CopyList);
m_pFirstLink = NULL;
m_pLastLink = NULL;
m_ulCount = 0;
for (itr.Init(); !itr; itr++)
InsertLast(itr());
}
//---------------------------------------------------------------------------
// @mfunc This destructor calls <mf UTList::RemoveAll> on the list to
// delete all links and the memory associated with them.
//
// @tcarg class | T | data type to store in the list
//
//---------------------------------------------------------------------------
template <class T> UTList< T >::~UTList(
void
)
{
RemoveAll();
}
//---------------------------------------------------------------------------
// @mfunc Reinitializes the list
//
// @tcarg class | T | data type to store in the list
//
//---------------------------------------------------------------------------
template <class T> void UTList< T >::Init (void)
{
m_ulCount = 0x0;
m_pFirstLink = 0x0;
m_pLastLink = 0x0;
}
//---------------------------------------------------------------------------
// @mfunc This is the assignment operator for <c UTList>. All elements
// are first removed from this list and then the list is generated
// by copying the assigned list. Assignment to self is prevented.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc Returns a reference to the newly assigned object
//---------------------------------------------------------------------------
template <class T> UTList< T >& UTList< T >::operator =(
const UTList< T >& AssignList // @parm [in] list to be copied (assigned from)
)
{
UTListIterator< T > itr((UTList< T >&)AssignList);
// make sure we're not assigning list to itself first
if (m_pFirstLink != AssignList.m_pFirstLink)
{
RemoveAll(); // remove all from this list first
for (itr.Init(); !itr; itr++)
InsertLast(itr());
}
return *this;
}
//---------------------------------------------------------------------------
// @mfunc This method duplicates the list into an entirely new list and
// returns a pointer to the new list.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc Pointer to the newly createe list
//---------------------------------------------------------------------------
template <class T> UTList< T > * UTList< T >::Duplicate(
void
)
{
UTListIterator< T > itr((UTList< T >&) *this);
UTList< T > * pNewList = new UTList();
if (pNewList)
{
for (itr.Init(); !itr; itr++)
pNewList->InsertLast(itr());
}
else
throw (EXCEPT_MEMORY);
return pNewList;
}
//---------------------------------------------------------------------------
// @mfunc This method adds the value to the end of the list by calling
// <mf UTList::InsertLast>.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTList< T >::Add(
const T& newValue // @parm [in] value to be added to list
)
{
InsertLast(newValue);
}
//---------------------------------------------------------------------------
// @mfunc This method inserts the new value at the beginning of the
// list.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTList< T >::InsertFirst(
const T& newValue // @parm [in] value to be inserted at beginning of list
)
{
UTLink< T > * pLink = m_pFirstLink; // save ptr to link
if (pLink) // list is not empty
{
m_pFirstLink = pLink->AddBefore(newValue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -