/// <summary> /// Set up this function by copying over an array of Sonic Adventure physics. /// </summary> public FixedArrayPtr() { // Read in the Sonic Adventure physics array from file, then copy over to self-allocated memory. byte[] bytes = File.ReadAllBytes("phys.bin"); _currentProcess = new Reloaded.Memory.Sources.Memory(); _adventurePhysicsArray = _currentProcess.Allocate(bytes.Length); _currentProcess.WriteRaw(_adventurePhysicsArray, bytes); _fixedArrayPtr = new FixedArrayPtr <AdventurePhysics>((ulong)_adventurePhysicsArray, PhysicsArrayLength); }
public void TestBuffer() { // Setup int bufferSize = 4096; var memory = new Reloaded.Memory.Sources.Memory(); var buffer = new Reloaded.Memory.Utilities.CircularBuffer(bufferSize, memory); // Properties. int structSize = Struct.GetSize <RandomIntStruct>(); int bufferElements = bufferSize / structSize; var randomIntStructs = new RandomIntStruct[bufferElements]; for (int x = 0; x < bufferElements; x++) { randomIntStructs[x] = RandomIntStruct.BuildRandomStruct(); } // Fill circular buffer and validate. for (int x = 0; x < bufferElements; x++) { // Save write pointer. IntPtr nextPointer = buffer.WritePointer + structSize; var address = buffer.Add(ref randomIntStructs[x]); memory.Read(address, out RandomIntStruct randIntStruct); // Check correct element and pointer did not loop. Assert.Equal(randomIntStructs[x], randIntStruct); Assert.Equal(nextPointer, buffer.WritePointer); } // Now check if item can fit, it should not. // Buffer should require looping. var randomIntStruct = RandomIntStruct.BuildRandomStruct(); var canFit = buffer.CanItemFit(ref randomIntStruct); Assert.Equal(Reloaded.Memory.Utilities.CircularBuffer.ItemFit.StartOfBuffer, canFit); // Add item to loop. var lastItemPtr = buffer.Add(ref randomIntStruct); Assert.Equal(buffer.Address, lastItemPtr); // New item should have been placed at offset 0. // Item too big. buffer.Offset = 0; byte[] sameSizeAsBuffer = new byte[bufferSize]; byte[] tooBigForBuffer = new byte[bufferSize + 1]; // Will not fit. Assert.Equal(Reloaded.Memory.Utilities.CircularBuffer.ItemFit.No, buffer.CanItemFit(tooBigForBuffer.Length)); Assert.Equal(IntPtr.Zero, buffer.Add(tooBigForBuffer)); // Will fit in current loop. Note Offset = 0. Assert.Equal(Reloaded.Memory.Utilities.CircularBuffer.ItemFit.Yes, buffer.CanItemFit(sameSizeAsBuffer.Length)); Assert.NotEqual(IntPtr.Zero, buffer.Add(sameSizeAsBuffer)); buffer.Offset = 1; // Will fit on next loop. Assert.Equal(Reloaded.Memory.Utilities.CircularBuffer.ItemFit.StartOfBuffer, buffer.CanItemFit(sameSizeAsBuffer.Length)); Assert.NotEqual(IntPtr.Zero, buffer.Add(sameSizeAsBuffer)); // Cleanup buffer.Dispose(); }