Beispiel #1
0
    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;
        }
    }