Files @ r4548:6a33e364fba5
Branch filter:

Location: cpp/openttd-patchpack/source/yapf/unittest/test_fixedsizearray.h

rubidium
(svn r6380) -Codechange: unify all ways to quit OTTD.
This means that in the intro menu the 'Quit' button immediatelly quits
and the 'Quit' in the menu of the normal game and scenario editor
immediatelly quits when the 'autosave_on_exit' patch is turned on.
This is the same way as the OS/window manager initiated quits, like
alt-F4 and the 'x' in the (OS/window manager drawn) title bar of OTTD.
/* $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;
}