//#define COSMOSDEBUG using System.Runtime.CompilerServices; namespace Cosmos.Core { /// /// MemoryOperations class. Used to do operations on the memory. /// public unsafe class MemoryOperations { #region Fill /// /// Fill memory block. Plugged. /// /// A destination. /// A data value. /// A data size. public static unsafe void Fill(byte* dest, int value, int size) { // Plugged } /// /// Fill data to destination. /// /// Destination. /// Data value. /// Data size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(uint* dest, uint value, int size) { Fill((byte*)dest, (int)value, size * 4); } /// /// Fill data to destination. /// /// Destination. /// Data value. /// Data size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(int* dest, int value, int size) { Fill((byte*)dest, value, size * 4); } /// /// Fill data to destination. /// /// Destination. /// Data value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(uint[] dest, uint value) { fixed (uint* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Fill data to destination. /// /// Destination. /// Data value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(int[] dest, int value) { fixed (int* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Fill data to destination. /// /// Destination. /// Data value. /// Data size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(ushort* dest, ushort value, int size) { /* Broadcast 'value' to fill all the integer register (0x42 --> 0x42424242) */ int valueFiller = value * 0x10001; Fill((byte*)dest, valueFiller, size * 2); } /// /// Fill data to destination. /// /// Destination. /// Data value. /// Data size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(short* dest, short value, int size) { /* Broadcast 'value' to fill all the integer register (0x42 --> 0x42424242) */ int valueFiller = (ushort)value * 0x10001; Fill((byte*)dest, valueFiller, size * 2); } /// /// Fill data to destination. /// /// Destination. /// Data value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(ushort[] dest, ushort value) { fixed (ushort* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Fill data to destination. /// /// Destination. /// Data value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(short[] dest, short value) { fixed (short* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Fill data to destination. /// /// Destination. /// Data value. /// Data size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(byte* dest, byte value, int size) { /* Broadcast 'value' fill all the integer register (0x42 --> 0x42424242) */ int valueFiller = value * 0x1010101; Fill(dest, valueFiller, size); } /// /// Fill data to destination. /// /// Destination. /// Data value. /// Data size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(sbyte* dest, sbyte value, int size) { /* Broadcast 'value' fill all the integer register (0x42 --> 0x42424242) */ int valueFiller = (byte)value * 0x1010101; Fill((byte*)dest, valueFiller, size); } /// /// Fill data to destination. /// /// Destination. /// Data value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(byte[] dest, byte value) { fixed (byte* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Fill data to destination. /// /// Destination. /// Data value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(sbyte[] dest, sbyte value) { fixed (sbyte* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Fill source to destination. /// /// Destination. /// Source. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Fill(sbyte[] dest, sbyte[] src) { fixed (sbyte* destPtr = dest) fixed (sbyte* srcPtr = src) { Copy(destPtr, srcPtr, dest.Length); } } #endregion Fill #region Copy /// /// Copy source to destination. /// plugged. /// /// Destination. /// Source. /// Size of data. public static unsafe void Copy(byte *dest, byte *src, int size) { // Plugged } /// /// Copy source to destination. /// /// Destination. /// Source. /// Size of data. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(uint* dest, uint *src, int size) { Copy((byte*)dest, (byte *)src, size * 4); } /// /// Copy source to destination. /// /// Destination. /// Source. /// Size of data. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(int* dest, int *src, int size) { Copy((byte*)dest, (byte*)src, size * 4); } /// /// Copy source to destination. /// /// Destination. /// Source. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(uint[] dest, uint[] src) { fixed (uint* destPtr = dest) fixed (uint *srcPtr = src) { Copy(destPtr, srcPtr, dest.Length); } } /// /// Copy source to destination. /// /// Destination. /// Source. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(int[] dest, int[] src) { fixed (int* destPtr = dest) fixed (int* srcPtr = src) { Copy(destPtr, srcPtr, dest.Length); } } /// /// Copy source to destination. /// /// Destination. /// Source. /// Size of data. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(ushort* dest, ushort* src, int size) { Copy((byte*)dest, (byte*)src, size * 2); } /// /// Copy source to destination. /// /// Destination. /// Source. /// Size of data. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(short* dest, short* src, int size) { Copy((byte*)dest, (byte*)src, size * 2); } /// /// Copy source to destination. /// /// Destination. /// Source. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(ushort[] dest, ushort[] src) { fixed (ushort* destPtr = dest) fixed (ushort* srcPtr = src) { Copy(destPtr, srcPtr, dest.Length); } } /// /// Copy source to destination. /// /// Destination. /// Value. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(short[] dest, short value) { fixed (short* destPtr = dest) { Fill(destPtr, value, dest.Length); } } /// /// Copy source to destination. /// /// Destination. /// Source. /// Size of data. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(sbyte* dest, sbyte *src, int size) { Copy((byte*)dest, (byte*)src, size); } /// /// Copy source to destination. /// /// Destination. /// Source. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Copy(byte[] dest, byte[] src) { fixed (byte* destPtr = dest) fixed (byte* srcPtr = src) { Copy(destPtr, srcPtr, dest.Length); } } #endregion Copy } }