186 lines
4.4 KiB
C++
Executable File
186 lines
4.4 KiB
C++
Executable File
#ifndef _COMMON_BLOCK_TPP_
|
|
#define _COMMON_BLOCK_TPP_
|
|
|
|
template <class T>
|
|
void Block<T>::remove(void)
|
|
{
|
|
if(!mContainer)return;
|
|
Container<T> *Cursor=mContainer;
|
|
Container<T> *Thumb;
|
|
while(Cursor)
|
|
{
|
|
Thumb=Cursor;
|
|
Cursor=Cursor->next();
|
|
::delete Thumb;
|
|
}
|
|
mContainer=0;
|
|
mLastIndexReferenced=-1L;
|
|
mLastObjectReferenced=0;
|
|
mLastObjectInserted=0;
|
|
mSize=0;
|
|
}
|
|
|
|
template <class T>
|
|
T &Block<T>::find(LONG itemIndex)
|
|
{
|
|
Container<T> *lpCursor=mContainer;
|
|
Index i=0;
|
|
for(i=0;i<mSize&&i<itemIndex;i++)lpCursor=lpCursor->next();
|
|
if(i==itemIndex)
|
|
{
|
|
mLastIndexReferenced=i;
|
|
mLastObjectReferenced=lpCursor;
|
|
return *lpCursor->mItem;
|
|
}
|
|
return *((T*)0);
|
|
}
|
|
|
|
template <class T>
|
|
Block<T> &Block<T>::operator+=(const Block<T> &someBlock)
|
|
{
|
|
size_t blockSize(someBlock.size());
|
|
|
|
if(!blockSize)return *this;
|
|
for(int itemIndex=0;itemIndex<blockSize;itemIndex++)insert(&((Block<T>&)someBlock)[itemIndex]);
|
|
return *this;
|
|
}
|
|
|
|
template <class T>
|
|
bool Block<T>::insertAfter(Index itemIndex,const T *item)
|
|
{
|
|
if(itemIndex>=mSize)return false;
|
|
mLastObjectInserted->next(::new Container<T>);
|
|
mLastObjectInserted->next()->prev(mLastObjectInserted);
|
|
mLastObjectInserted=mLastObjectInserted->next();
|
|
mLastObjectInserted->mItem=::new T();
|
|
mSize++;
|
|
for(int index=mSize-1;index>itemIndex+1;index--)
|
|
{
|
|
operator[](index)=operator[](index-1);
|
|
}
|
|
operator[](itemIndex+1)=*item;
|
|
return true;
|
|
}
|
|
|
|
template <class T>
|
|
void Block<T>::insert(Block<T> &newBlock)
|
|
{
|
|
LONG size(newBlock.size());
|
|
for(Index i=0;i<size;i++)insert(&newBlock[i]);
|
|
}
|
|
|
|
template <class T>
|
|
void Block<T>::insert(const T& item)
|
|
{
|
|
insert(&item);
|
|
}
|
|
|
|
template <class T>
|
|
void Block<T>::insert(const T *item)
|
|
{
|
|
if(!mContainer)
|
|
{
|
|
mContainer=::new Container<T>;
|
|
mContainer->mItem=::new T(*item);
|
|
mLastObjectInserted=mContainer;
|
|
mSize++;
|
|
}
|
|
else
|
|
{
|
|
mLastObjectInserted->next(::new Container<T>);
|
|
mLastObjectInserted->next()->prev(mLastObjectInserted);
|
|
mLastObjectInserted=mLastObjectInserted->next();
|
|
mLastObjectInserted->mItem=::new T(*item);
|
|
mSize++;
|
|
}
|
|
}
|
|
|
|
template <class T>
|
|
void Block<T>::remove(Block<T> &removeBlock)
|
|
{
|
|
LONG size(removeBlock.size());
|
|
|
|
if(!size)return;
|
|
for(long itemIndex=size-1;itemIndex>=0;itemIndex--)remove(&removeBlock[itemIndex]);
|
|
}
|
|
|
|
template <class T>
|
|
void Block<T>::remove(const T *item)
|
|
{
|
|
Container<T> *lpThumb=mContainer;
|
|
|
|
if(!lpThumb)return;
|
|
if(*item==*(mLastObjectInserted->mItem))lpThumb=mLastObjectInserted;
|
|
else while(lpThumb){if(*item==*(lpThumb->mItem))break;lpThumb=lpThumb->next();}
|
|
if(!lpThumb)return;
|
|
if(lpThumb==mContainer)
|
|
{
|
|
if(lpThumb->next()){mContainer=lpThumb->next();mContainer->prev(0);}
|
|
else {mContainer=0;mLastObjectInserted=0;}
|
|
}
|
|
else
|
|
{
|
|
if(lpThumb->next()){lpThumb->prev()->next(lpThumb->next());lpThumb->next()->prev(lpThumb->prev());}
|
|
else {lpThumb->prev()->next(0);mLastObjectInserted=lpThumb->prev();}
|
|
}
|
|
::delete lpThumb;
|
|
mSize--;
|
|
mLastIndexReferenced=-1;
|
|
mLastObjectReferenced=0;
|
|
}
|
|
|
|
template <class T>
|
|
void Block<T>::remove(LONG itemIndex)
|
|
{
|
|
Container<T> *lpThumb=mContainer;
|
|
|
|
if(!lpThumb||itemIndex>=mSize)return;
|
|
if(itemIndex==mSize-1)lpThumb=mLastObjectInserted;
|
|
else
|
|
{
|
|
for(Index i=0;i<itemIndex&&lpThumb;i++)
|
|
{
|
|
if(itemIndex==i)break;
|
|
lpThumb=lpThumb->next();
|
|
}
|
|
if(!lpThumb)return;
|
|
}
|
|
if(lpThumb==mContainer)
|
|
{
|
|
if(lpThumb->next()){mContainer=lpThumb->next();mContainer->prev(0);}
|
|
else {mContainer=0;mLastObjectInserted=0;}
|
|
}
|
|
else
|
|
{
|
|
if(lpThumb->next()){lpThumb->prev()->next(lpThumb->next());lpThumb->next()->prev(lpThumb->prev());}
|
|
else {lpThumb->prev()->next(0);mLastObjectInserted=lpThumb->prev();}
|
|
}
|
|
::delete lpThumb;
|
|
mSize--;
|
|
mLastIndexReferenced=-1;
|
|
mLastObjectReferenced=0;
|
|
}
|
|
|
|
template <class T>
|
|
Block<T> &Block<T>::operator=(const Block<T> &someBlock)
|
|
{
|
|
LONG itemCount(someBlock.size());
|
|
|
|
remove();
|
|
if(!itemCount)return *this;
|
|
for(LONG itemIndex=0;itemIndex<itemCount;itemIndex++)insert(&(((Block<T>&)someBlock)[itemIndex]));
|
|
return *this;
|
|
}
|
|
|
|
template <class T>
|
|
WORD Block<T>::operator==(const Block<T> &someBlock)const
|
|
{
|
|
LONG itemCount(size());
|
|
|
|
if(itemCount!=someBlock.size())return FALSE;
|
|
for(LONG itemIndex=0;itemIndex<itemCount;itemIndex++)
|
|
if(!(((Block<T>&)*this).operator[](itemIndex)==((Block<T>&)someBlock)[itemIndex]))return FALSE;
|
|
return TRUE;
|
|
}
|
|
#endif
|