79 lines
946 B
C
79 lines
946 B
C
![]() |
#pragma once
|
||
|
|
||
|
template <class T>
|
||
|
struct List
|
||
|
{
|
||
|
T* daty;
|
||
|
int avail;
|
||
|
|
||
|
int size;
|
||
|
bool* overrun;
|
||
|
|
||
|
__forceinline int used() const { return size-avail; }
|
||
|
__forceinline int bytes() const { return used()* sizeof(T); }
|
||
|
|
||
|
NOINLINE
|
||
|
T* sig_overrun()
|
||
|
{
|
||
|
*overrun |= true;
|
||
|
Clear();
|
||
|
|
||
|
return daty;
|
||
|
}
|
||
|
|
||
|
__forceinline
|
||
|
T* Append(int n=1)
|
||
|
{
|
||
|
int ad=avail-n;
|
||
|
|
||
|
if (ad>=0)
|
||
|
{
|
||
|
T* rv=daty;
|
||
|
daty+=n;
|
||
|
avail=ad;
|
||
|
return rv;
|
||
|
}
|
||
|
else
|
||
|
return sig_overrun();
|
||
|
}
|
||
|
|
||
|
__forceinline
|
||
|
T* LastPtr(int n=1)
|
||
|
{
|
||
|
return daty-n;
|
||
|
}
|
||
|
|
||
|
T* head() const { return daty-used(); }
|
||
|
|
||
|
void InitBytes(int maxbytes,bool* ovrn)
|
||
|
{
|
||
|
maxbytes-=maxbytes%sizeof(T);
|
||
|
|
||
|
daty=(T*)malloc(maxbytes);
|
||
|
|
||
|
verify(daty!=0);
|
||
|
|
||
|
avail=size=maxbytes/sizeof(T);
|
||
|
|
||
|
overrun=ovrn;
|
||
|
|
||
|
Clear();
|
||
|
}
|
||
|
|
||
|
void Init(int maxsize,bool* ovrn)
|
||
|
{
|
||
|
InitBytes(maxsize*sizeof(T),ovrn);
|
||
|
}
|
||
|
|
||
|
void Clear()
|
||
|
{
|
||
|
daty=head();
|
||
|
avail=size;
|
||
|
}
|
||
|
|
||
|
void Free()
|
||
|
{
|
||
|
Clear();
|
||
|
free(daty);
|
||
|
}
|
||
|
};
|