public static void ArrayCopy(ulong[] src, int srcOffset, byte[] dst, int dstOffset, int count) { Contract.Requires <ArgumentNullException>(src != null); Contract.Requires <ArgumentOutOfRangeException>(srcOffset >= 0); Contract.Requires <ArgumentNullException>(dst != null); Contract.Requires <ArgumentOutOfRangeException>(dstOffset >= 0); Contract.Requires <ArgumentOutOfRangeException>(ArrayCopyToBytesBoundsValidate( src, srcOffset, dst, dstOffset, count, sizeof(ulong))); var memcpy = new MemoryCopier <byte, ulong>(dummy: false); memcpy.CopyInternal(dst, dstOffset, src, srcOffset, count); }
static Program() { var m2 = new DynamicMethod( "memcpy", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, typeof(void), new[] { typeof(byte *), typeof(byte *), typeof(uint) }, typeof(Program), false); var il2 = m2.GetILGenerator(); il2.Emit(OpCodes.Ldarg_0); // dst address il2.Emit(OpCodes.Ldarg_1); // src address il2.Emit(OpCodes.Ldarg_2); // number of bytes il2.Emit(OpCodes.Cpblk); il2.Emit(OpCodes.Ret); MemcpyDelegate = (MemoryCopier)m2.CreateDelegate(typeof(MemoryCopier)); }
public override void CopyFromStorage(IntPtr dst, long storageIndex, long byteCount) { var srcPtr = PtrAtElement(storageIndex); MemoryCopier.Copy(dst, srcPtr, (ulong)byteCount); }
public override void CopyToStorage(long storageIndex, IntPtr src, long byteCount) { var dstPtr = PtrAtElement(storageIndex); MemoryCopier.Copy(dstPtr, src, (ulong)byteCount); }