psilogic: (Default)
[personal profile] psilogic
Задачка: как оптимизировать такой код, чтобы убрать копи-пасты?
Напрашивается заведение двух функций... а, может, кто-нибудь знает другие трюки?


if (undoCase)
{
	if (op & OpBefore)
	{
		uf.read(&hb, sizeof(hb));
		*hNew= hb;
		++hNew;
		++i;
	}
	if (op & OpAfter)
	{
		uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
		++hOld;
	}
}
else
{
	if (op & OpBefore)
	{
		uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass undo data
		++hOld;
	}
	if (op & OpAfter)
	{
		uf.read(&hb, sizeof(hb));
		*hNew= hb;
		++hNew;
		++i;
	}
}


Upd: Порядок вызова seek/read важен - там в файле два последовательных блока, наличие/отсутствие которых определяется флагами OpAfter/OpBefore.

Date: 2011-04-05 07:09 pm (UTC)
From: [identity profile] kindex.livejournal.com
for (int i = 0; i <= 1; i++)
{
if (!!i != !!undoCase && (op & OpBefore))
{
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
if (!!i == !!undoCase && (op & OpAfter))
{
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
++hOld;
}
}

Date: 2011-04-05 07:09 pm (UTC)
From: [identity profile] kindex.livejournal.com
!! - это приведение к bool.

Date: 2011-04-05 07:17 pm (UTC)
From: [identity profile] kindex.livejournal.com
Вкралась ошибка - OpBefore и OpAfter используется неправильно.
первый (op & OpBefore) надо заменить на (op & (undoCase ? OpBefore : OpAfter)), и второй & аналогично.

Date: 2011-04-05 08:14 pm (UTC)
From: [identity profile] psilogic.livejournal.com
ну мелкие ошибки несущественны, главное - идея понятна

Date: 2011-04-05 08:13 pm (UTC)
From: [identity profile] psilogic.livejournal.com
угу, for как goto :)
Page generated Sep. 21st, 2025 10:54 am
Powered by Dreamwidth Studios