📄 utlist.h
字号:
}
return (m_pCurrentLink != NULL);
}
//---------------------------------------------------------------------------
// @mfunc This operator decrements the iterator to the prev element in the
// list and returns an indication of whether or not the front of the
// list has been passed.
//
// @tcarg class | T | data type to iterate over
//
// @rdesc Returns a BOOL
// @flag TRUE | if new position is valid
// @flag FALSE | if new position is NOT valid
//---------------------------------------------------------------------------
template <class T> BOOL UTListIterator< T >::operator --(
int dummy // @parm [in] dummy so that operator is on right hand side
)
{
m_pCurrentLink = m_pPreviousLink;
if (m_pCurrentLink)
{
m_pPreviousLink = m_pCurrentLink->m_pPrevLink;
}
return (m_pCurrentLink != NULL);
}
//---------------------------------------------------------------------------
// @mfunc RemoveCurrent deletes the element at the position of the
// iterator returning the deleted value through a CALLER
// allocated parameter. <nl>
// It then fixes the current position to the following: <nl><nl>
// If we... The we... <nl>
// 1) removed any link but 1st one old previous position->next <nl>
// 2) removed first link(links remain) new first position <nl>
// 3) removed only link NULL (no current position) <nl>
//
// @tcarg class | T | data type to iterate over
//
// @rdesc Returns a BOOL
// @flag TRUE | if current element exists and was removed
// @flag FALSE | otherwise
//---------------------------------------------------------------------------
template <class T> BOOL UTListIterator< T >::RemoveCurrent(
T* pType // @parm [out] location to put current element if available
)
{
BOOL bReturn = FALSE;
if (m_pCurrentLink) // remove ONLY if iterator is still in valid position
{
if (m_pPreviousLink == NULL) // removing first element
{
if (m_pCurrentLink->m_pNextLink == NULL) // ONLY element
{
m_List.m_pFirstLink = m_List.m_pLastLink = NULL;
}
else // first, but not last element
{
m_List.m_pFirstLink = m_pCurrentLink->m_pNextLink;
m_pCurrentLink->m_pNextLink->m_pPrevLink = NULL;
}
}
else // not removing first element
{
if (m_pCurrentLink->m_pNextLink == NULL) // last element
{
m_List.m_pLastLink = m_pPreviousLink;
m_pPreviousLink->m_pNextLink = NULL;
}
else // neither first nor last element
{
m_pPreviousLink->m_pNextLink = m_pCurrentLink->m_pNextLink;
m_pCurrentLink->m_pNextLink->m_pPrevLink = m_pPreviousLink;
}
}
*pType = m_pCurrentLink->m_Value;
bReturn = TRUE;
delete m_pCurrentLink;
m_List.m_ulCount--;
// now fix up the current iterator pointer
if (m_pPreviousLink)
m_pCurrentLink = m_pPreviousLink->m_pNextLink;
else if (m_List.m_pFirstLink)
m_pCurrentLink = m_List.m_pFirstLink;
else
m_pCurrentLink = NULL;
}
return bReturn;
}
//---------------------------------------------------------------------------
// @mfunc This method adds a new link to the list (using data passed as
// an argument) in a position just before the current position
// of the iterator.
//
// @tcarg class | T | data type to iterate over
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTListIterator< T >::InsertBefore(
const T& newValue // @parm [in] new data to be added before the current position
)
{
if (m_pCurrentLink) // add ONLY if iterator is still in valid position
{
if (m_pPreviousLink) // not at beginning
{
m_pCurrentLink->AddBefore(newValue);
}
else // at beginning of list
{
m_List.m_pFirstLink = m_pCurrentLink->AddBefore(newValue);
}
m_List.m_ulCount++;
// fix prev pointer which is now two links away
m_pPreviousLink = m_pCurrentLink->m_pPrevLink;
}
}
//---------------------------------------------------------------------------
// @mfunc This method adds a new link to the list (using data passed as
// an argument) in a position immediately following the current
// position of the iterator.
//
// @tcarg class | T | data type to iterate over
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTListIterator< T >::InsertAfter(
const T& newValue // @parm [in] new data to be added after the current position
)
{
if (m_pCurrentLink) // add ONLY if iterator is still in valid position
{
if (m_pCurrentLink->m_pNextLink) // not at end
{
m_pCurrentLink->AddAfter(newValue);
}
else // at end of list
{
m_List.m_pLastLink = m_pCurrentLink->AddAfter(newValue);
}
m_List.m_ulCount++;
}
}
//---------------------------------------------------------------------------
// @mfunc This method resets the iterator at the value passed
// in as an argument if it exists in the list and returns
// TRUE in that case indicating that it did change position.
// If the value does not exist, the position remains
// unchanged, and FALSE is returned to indicate this.
//
// @tcarg class | T | data type to iterate over
//
// @rdesc Returns a BOOL
// @flag TRUE | if posistion has changed
// @flag FALSE | otherwise
//---------------------------------------------------------------------------
template <class T> BOOL UTListIterator< T >::SetPosAt(
const T& value //@parm [in] if this value is in list, set up iterator at its location
)
{
BOOL bReturn = FALSE;
UTLink< T > * pLink = m_List.m_pFirstLink;
while (pLink && pLink->m_Value != value)
pLink = pLink->m_pNextLink;
if (pLink) // found value in list
{
m_pCurrentLink = pLink;
m_pPreviousLink = pLink->m_pPrevLink;
bReturn = TRUE;
}
return bReturn;
}
//---------------------------------------------------------------------------
// @mfunc Constructors
//
// @tcarg class | T | data type to store in the list
//
// @syntax UTStaticList< T >::UTStaticList()
//
// @rdesc None.
//
//---------------------------------------------------------------------------
template <class T> UTStaticList< T >::UTStaticList(
void
)
: m_ulCount(0), m_pFirstLink(NULL), m_pLastLink(NULL)
{
// do nothing
}
//---------------------------------------------------------------------------
// @mfunc This destructor does nothing
//
// @tcarg class | T | data type to store in the list
//
//---------------------------------------------------------------------------
template <class T> UTStaticList< T >::~UTStaticList(
void
)
{
//Do nothing
}
//---------------------------------------------------------------------------
// @mfunc Reinitializes the list
//
// @tcarg class | T | data type to store in the list
//
//---------------------------------------------------------------------------
template <class T> void UTStaticList< T >::Init (void)
{
m_ulCount = 0x0;
m_pFirstLink = 0x0;
m_pLastLink = 0x0;
}
//---------------------------------------------------------------------------
// @mfunc This method adds the link to the end of the list by calling
// <mf UTStaticList::InsertLast>.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTStaticList< T >::Add(
UTLink <T> * pLink // @parm [in] Link to be added to list
)
{
InsertLast(pLink);
}
//---------------------------------------------------------------------------
// @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 UTStaticList< T >::InsertFirst(
UTLink <T> * pLink // @parm [in] link to be inserted at beginning of list
)
{
if (m_pFirstLink) // list is not empty
{
pLink->m_pPrevLink = (UTLink<T> *) 0;
pLink->m_pNextLink = m_pFirstLink;
m_pFirstLink->m_pPrevLink = pLink;
m_pFirstLink = pLink;
}
else // list is empty
{
m_pFirstLink = pLink;
m_pLastLink = pLink;
}
m_ulCount++;
} //End UTStaticList::InsertFirst
//---------------------------------------------------------------------------
// @mfunc This method inserts the new link at the end of the list.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTStaticList< T >::InsertLast(
UTLink <T> * pLink // @parm [in] link to be inserted at end of list
)
{
if (m_pLastLink) // list is not empty
{
pLink->m_pNextLink = (UTLink<T> *) 0;
pLink->m_pPrevLink = m_pLastLink;
m_pLastLink->m_pNextLink = pLink;
m_pLastLink = pLink;
}
else // list is empty
{
m_pFirstLink = pLink;
m_pLastLink = pLink;
}
//Increment the count
m_ulCount++;
} //End UTStaticList::InsertLast
//---------------------------------------------------------------------------
// @mfunc This method resets the list count and pointers as they were set in
// the constructor.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc None.
//---------------------------------------------------------------------------
template <class T> void UTStaticList< T >::RemoveAll
(
void
)
{
//UNDONE - gaganc Need to reset the pointers of all the links to NULL
m_pFirstLink = NULL;
m_pLastLink = NULL;
m_ulCount = 0;
} //End UTStaticList::RemoveAll
//---------------------------------------------------------------------------
// @mfunc This method removes the first element from the list and fixes
// the pointer to the first element according to what remains
// of the list. The former first element is returned through a
// CALLER allocated variable.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc Returns a BOOL
// @flag TRUE | if first element exists and is deleted
// @flag FALSE | otherwise
//---------------------------------------------------------------------------
template <class T> BOOL UTStaticList< T >::RemoveFirst(
UTLink<T> ** ppLink // @parm [out] location to put first element if available
)
{
BOOL bReturn = FALSE;
//Assign the out param the first link
*ppLink = m_pFirstLink;
if (m_pFirstLink)
{
// Reset the first link
m_pFirstLink = m_pFirstLink->m_pNextLink;
if (m_pFirstLink)
m_pFirstLink->m_pPrevLink = NULL;
if (m_pLastLink == *ppLink)
m_pLastLink = NULL;
bReturn = TRUE;
m_ulCount--;
}
//Remember to clear previous and the next pointers in the link
if (*ppLink)
{
(*ppLink)->m_pNextLink = NULL;
(*ppLink)->m_pPrevLink = NULL;
}
return bReturn;
} //End UTStaticList::RemoveFirst
//---------------------------------------------------------------------------
// @mfunc This method removes the last element from the list and fixes
// the pointer to the last element according to what remains
// of the list. The former last element is returned through a
// CALLER allocated variable.
//
// @tcarg class | T | data type to store in the list
//
// @rdesc Returns a BOOL
// @flag TRUE | if last element exists and is deleted
// @flag FALSE | otherwise
//
//---------------------------------------------------------------------------
template <class T> BOOL UTStaticList< T >::RemoveLast(
UTLink<T> ** ppLink // @parm [out] location to put first element if available
)
{
BOOL bReturn = FALSE;
*ppLink = m_pLastLink;
if (m_pLastLink)
{
// isolate the link that is about to be deleted
m_pLastLink = m_pLastLink->m_pPrevLink;
if (m_pLastLink)
m_pLastLink->m_pNextLink = NULL;
if (m_pFirstLink == *ppLink)
m_pFirstLink = NULL;
bReturn = TRUE;
m_ulCount--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -