using StgSharp; using StgSharp.Control; using StgSharp.Logic; using System.Data; using System.Runtime.InteropServices; namespace StgSharp.Math { public unsafe class M128Map { public readonly long mapID; internal long mapPtr; internal readonly StgSharp.LinkedListNode _unusedM128Header; private const int mapSize = 30 * 30; internal StgSharp.LinkedList m128Map = new StgSharp.LinkedList(); public bool isFull { get { return _unusedM128Header == m128Map._hook; } } public M128Map() { mapPtr = (long)(Marshal.AllocHGlobal(sizeof(M128)*mapSize)+15); long firstM128ptr = (mapPtr / 16 + 1) * 16; m128Map.Add(0); _unusedM128Header = m128Map._hook._next; for (int i = 0; i < 4*30*30*4; i+=16) { m128Map.Add(firstM128ptr+i); } mapID = Calc.RandomSeed(); } internal long RegistManagedM128Ptr() { LinkedListNode m128 = _unusedM128Header._next; LinkedListNode m128Previous = _unusedM128Header._previous; m128._next._previous = _unusedM128Header.Next; m128Previous._next = m128; m128._previous = m128Previous; _unusedM128Header._next = m128._next; m128._next = _unusedM128Header; _unusedM128Header._previous = m128; return m128._value; } internal void RecycleManagedM128Ptr() { } } }