Files
Work/mdiwin/VECTOR.TPP
2024-08-07 09:16:27 -04:00

120 lines
2.6 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
template <class T>
Vector<T>::Vector(void)
: mEntries(0), mlpVectorTable(0), mlpMemPool(0)
{
}
template <class T>
Vector<T>::~Vector()
{
vectorDelete();
}
void FAR *operator new(size_t /*size*/,int /*n*/,void FAR *lpData)
{
return lpData;
}
template <class T>
LONG Vector<T>::size(void)const
{
return mEntries;
}
template <class T>
LONG Vector<T>::size(LONG numEntries)
{
vectorDelete();
if(0==(mEntries=numEntries))return 0L;
vectorNew();
return mEntries;
}
template <class T>
T &Vector<T>::operator[](LONG itemIndex)
{
assert(itemIndex<mEntries);
if(itemIndex>=mEntries)return *((T*)0);
return *((T FAR *)*(mlpVectorTable+itemIndex));
}
template <class T>
WORD Vector<T>::operator==(const Vector<T> &someVector)const
{
if(mEntries!=someVector.mEntries)return FALSE;
for(Index i=0;i<mEntries;i++)
{
if(!(*((T FAR *)*(mlpVectorTable+i))==
*((T FAR *)*(someVector.mlpVectorTable+i))))return FALSE;
}
return TRUE;
}
template <class T>
WORD Vector<T>::operator=(const Vector<T> &someVector)
{
vectorDelete();
if(0==(mEntries=someVector.mEntries))return FALSE;
vectorNew();
for(Index i=0;i<mEntries;i++)
{
*((T FAR *)*(mlpVectorTable+i))=
*((T FAR *)*(someVector.mlpVectorTable+i));
}
return TRUE;
}
template <class T>
WORD Vector<T>::operator=(Block<T> &someBlock)
{
LONG blockSize(someBlock.size());
if(!blockSize)return FALSE;
size(blockSize);
for(Index i=0;i<blockSize;i++)operator[](i)=someBlock[i];
return TRUE;
}
//template <class T>
//Vector<T>::operator T*()
//{
// return (T FAR *)mlpMemPool;
//}
template <class T>
void Vector<T>::vectorNew(void)
{
mlpVectorTable=(T HUGE **)::GlobalLock(::GlobalAlloc(GMEM_ZEROINIT|GMEM_FIXED,mEntries*sizeof(T FAR *)));
assert(0!=mlpVectorTable);
mlpMemPool=(T HUGE *)::GlobalLock(::GlobalAlloc(GMEM_ZEROINIT|GMEM_FIXED,mEntries*sizeof(T)));
assert(0!=mlpMemPool);
for(Index i=0;i<mEntries;i++)
{
*(mlpVectorTable+i)=(T FAR *)(mlpMemPool+i);
new (0,(void FAR *)(mlpMemPool+i)) T;
assert(0!=*(mlpVectorTable+i));
}
}
template <class T>
void Vector<T>::vectorDelete(void)
{
if(!mlpVectorTable)return;
if(!mlpMemPool)return;
for(Index i=0;i<mEntries;i++)(*(mlpVectorTable+i))->~T();
#if defined(__FLAT__)
::GlobalUnlock(::GlobalHandle(mlpMemPool));
::GlobalFree(::GlobalHandle(mlpMemPool));
::GlobalUnlock(::GlobalHandle(mlpVectorTable));
::GlobalFree(mlpVectorTable);
#else
::GlobalUnlock((HGLOBAL)(FP_SEG(mlpMemPool)-1));
::GlobalFree((HGLOBAL)(FP_SEG(mlpMemPool)-1));
::GlobalUnlock((HGLOBAL)(FP_SEG(mlpVectorTable)-1));
::GlobalFree((HGLOBAL)(FP_SEG(mlpVectorTable)-1));
#endif
mlpVectorTable=0;
mlpMemPool=0;
}