/* $Id$ */
struct CFsaItem
{
int i;
FORCEINLINE static int& NumInstances() { static int num_instances = 0; return num_instances; };
FORCEINLINE CFsaItem(int i = 0)
{
this->i = i;
NumInstances()++;
DBG("(*)");
}
FORCEINLINE CFsaItem(const CFsaItem& src)
{
this->i = src.i;
NumInstances()++;
DBG("(c)");
}
FORCEINLINE ~CFsaItem()
{
NumInstances()--;
DBG("(-)");
}
};
typedef CFixedSizeArrayT<CFsaItem, 4> CSubArray;
typedef CFixedSizeArrayT<CSubArray, 4> CSuperArray;
static int TestFixedSizeArray(bool silent)
{
int res = 0;
{
CSuperArray a;
CHECK_INT(0, a.IsFull(), false);
CHECK_INT(1, a.IsEmpty(), true);
CSubArray& b1 = a.Add();
b1.Add().i = 1;
new(&b1.AddNC())CFsaItem(2);
CSubArray& b2 = a.Add();
new(&b2.AddNC())CFsaItem(3);
b2.Add().i = 4;
CSubArray& b3 = a.AddNC();
new(&b3)CSubArray(b1);
CSubArray& b4 = a.AddNC();
new(&b4)CSubArray(b2);
CHECK_INT(2, a[0][0].i, 1);
CHECK_INT(3, b1[1].i, 2);
CHECK_INT(4, b1.Size(), 2);
CHECK_INT(5, a[3][0].i, 3);
CHECK_INT(6, a[3][1].i, 4);
CHECK_INT(7, CFsaItem::NumInstances(), 4);
CHECK_INT(8, a.IsFull(), true);
CHECK_INT(9, a.IsEmpty(), false);
CHECK_INT(10, a[3].IsFull(), false);
CHECK_INT(11, a[3].IsEmpty(), false);
}
CHECK_INT(12, CFsaItem::NumInstances(), 0);
return res;
}
typedef CArrayT<CFsaItem, 2> CArray;
static int TestArray(bool silent)
{
int res = 0;
{
CArray a;
CHECK_INT(0, a.IsFull(), false);
CHECK_INT(1, a.IsEmpty(), true);
CHECK_INT(2, a.Size(), 0);
a.Add().i = 1;
CHECK_INT(3, a.Size(), 1);
new(&a.AddNC())CFsaItem(2);
CHECK_INT(4, a.Size(), 2);
CHECK_INT(5, a.IsFull(), false);
CHECK_INT(6, a.IsEmpty(), false);
a.Add().i = 3;
CHECK_INT(7, a.Size(), 3);
new(&a.AddNC())CFsaItem(4);
CHECK_INT(8, a.Size(), 4);
CHECK_INT(9, a[0].i, 1);
CHECK_INT(10, a[1].i, 2);
CHECK_INT(11, a[2].i, 3);
CHECK_INT(12, a[3].i, 4);
CHECK_INT(13, a.IsFull(), true);
CHECK_INT(14, a.IsEmpty(), false);
CHECK_INT(15, CFsaItem::NumInstances(), 4);
}
CHECK_INT(16, CFsaItem::NumInstances(), 0);
return res;
}