mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2024-09-10 11:32:43 +02:00
114 lines
2.1 KiB
C
114 lines
2.1 KiB
C
![]() |
/* $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;
|
||
|
}
|