public void FillSpace( PackedSpace t0Space, PackedSpace tm1Space, PackedSpace tm2Space ) { var cellSizeBits = packer.cellSizeBits; var cellsPerPack = packer.cellsPerPack; var ss = t0Space.spaceSize; var ps = t0Space.packedSize; var n = tablePackN; var tableN = tablePackedNCell; var nCellShift = n * cellSizeBits; var np2CellShift = (n + 2) * cellSizeBits; var np2CellMask = (1 << np2CellShift) - 1; var indexSize = n + n + 2; var combinedStateShift = indexSize * cellSizeBits; var combinedStateMask = ~(-1 << combinedStateShift); int GetStateNCell(int _pcn, int _n1cnn2) { var combinedState = ((_pcn << np2CellShift) | (_n1cnn2 & np2CellMask)) & combinedStateMask; return(tableN[combinedState]); } for (var px = 0; px < ps; px++) { var ptm1n1 = (px - 1 >= 0) ? tm1Space.packed[px - 1] : 0; var ptm1c = tm1Space.packed[px]; var ptm1n2 = (px + 1 < ps) ? tm1Space.packed[px + 1] : 0; var ptm2c = tm2Space.packed[px]; int pack = 0; var _ptm1c = packer.AppendToPack(ptm1n1, ptm1c, cellsPerPack - 1); for (var sx = 0; sx < cellsPerPack - 2; sx += n) { var shift = sx * cellSizeBits; var state = GetStateNCell(ptm2c >> shift, _ptm1c >> shift); pack |= state << shift; } _ptm1c = packer.AppendToPack(ptm1c, ptm1n2, 1); pack = pack & ~(-1 << ((cellsPerPack - 2) * cellSizeBits)); for (var sx = cellsPerPack - 2; sx < cellsPerPack; sx += n) { var shift = sx * cellSizeBits; var state = GetStateNCell( ptm2c >> shift, _ptm1c >> (shift - 2 * cellSizeBits)); pack |= state << shift; } t0Space.packed[px] = pack; } }