#ifndef _BLOCK_HPP_ #error BLOCK.HPP MUST PRECEDE BLOCK.TPP #endif #ifdef _EXPAND_BLOCK_TEMPLATES_ //#pragma option -Jgd #endif template Block::Block() : mContainer(0), mSize(0), mLastIndexReferenced(-1), mLastObjectReferenced(0), mLastObjectInserted(0) { } template Block::~Block() { remove(); } template void Block::remove(void) { if(!mContainer)return; Container *Cursor=mContainer; Container *Thumb; while(Cursor) { Thumb=Cursor; Cursor=Cursor->Next(); delete Thumb; } mContainer=0; mLastIndexReferenced=-1L; mLastObjectReferenced=0; mLastObjectInserted=0; mSize=0; } template T & Block::operator [](LONG itemIndex) { Container *Cursor; assert(itemIndexmItem; if(itemIndex==mLastIndexReferenced+1 && -1!=mLastIndexReferenced) { mLastIndexReferenced++; mLastObjectReferenced=mLastObjectReferenced->Next(); return *mLastObjectReferenced->mItem; } Cursor=mContainer; for(Index i=0;iNext(); if(i==itemIndex) { mLastIndexReferenced=i; mLastObjectReferenced=Cursor; return *Cursor->mItem; } return *((T*)0); } template void Block::insert(Block &newBlock) { LONG size(newBlock.size()); for(Index i=0;i void Block::insert(const T *item) { if(!mContainer) { mContainer=new Container; mContainer->mItem=new T(*item); mLastObjectInserted=mContainer; mSize++; } else { mLastObjectInserted->Next(new Container); mLastObjectInserted=mLastObjectInserted->Next(); mLastObjectInserted->mItem=new T(*item); mSize++; } } template void Block::remove(Block &oldBlock) { LONG size(oldBlock.size()); for(Index i=0;i void Block::remove(const T *item) { if(!mContainer)return; Container *Thumb=mContainer; Container *Prev=0; while(Thumb) { if(*item==*(Thumb->mItem)) break; Prev=Thumb; Thumb=Thumb->mNext; } if(!Thumb)return; if(Thumb==mContainer) { if(Thumb->Next()) mContainer=Thumb->Next(); else mContainer=0; } else { if(Thumb->Next()) Prev->Next(Thumb->Next()); else Prev->Next(0); } delete Thumb; mSize--; synchronizeBlock(); } template void Block::remove(LONG itemIndex) { if(!mContainer)return; Container *Thumb=mContainer; Container *Prev=0; for(Index i=0;iNext(); } if(!Thumb)return; if(Thumb==mContainer) { if(Thumb->Next()) mContainer=Thumb->Next(); else mContainer=0; } else { if(Thumb->Next()) Prev->Next(Thumb->Next()); else Prev->Next(0); } delete Thumb; mSize--; synchronizeBlock(); } template void Block::synchronizeBlock(void) { Container *Thumb=mLastObjectInserted=mContainer; mLastIndexReferenced=-1; mLastObjectReferenced=0; while(Thumb) { mLastObjectInserted=Thumb; Thumb=Thumb->Next(); } } template LONG Block::size(void)const { return mSize; } template int Block::operator=(Block &someBlock) { LONG blockSize(someBlock.size()); if(!blockSize)return FALSE; remove(); for(LONG i=0;i int Block::operator=(Vector &someVector) { LONG blockSize(someVector.size()); if(!blockSize)return FALSE; remove(); for(LONG i=0;i Container::Container() : mNext(0), mItem(0) { } template Container::~Container() { delete mItem; } template Container *Container::Next(void) { return mNext; } template void Container::Next(Container *nextItem) { mNext=nextItem; }