Merge pull request #2353 from ludovic-henry/fix-servicemodel-15153
[mono.git] / mcs / class / corlib / ReferenceSources / Buffer.cs
index 94b3a9552693a37f13cceda859997881a20d8677..f13d7d3699060f10aef53f989774d4d6f9b6c257 100644 (file)
@@ -64,6 +64,44 @@ namespace System
                        }
                }
 
+               [CLSCompliantAttribute (false)]
+               public static unsafe void MemoryCopy (void* source, void* destination, long destinationSizeInBytes, long sourceBytesToCopy)
+               {
+                       if (sourceBytesToCopy > destinationSizeInBytes) {
+                               ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.sourceBytesToCopy);
+                       }
+
+                       var src = (byte*)source;
+                       var dst = (byte*)destination;
+                       while (sourceBytesToCopy > int.MaxValue) {
+                               Memcpy (dst, src, int.MaxValue);
+                               sourceBytesToCopy -= int.MaxValue;
+                               src += int.MaxValue;
+                               dst += int.MaxValue;
+                       }
+
+                       memcpy1 (dst, src, (int) sourceBytesToCopy);
+               }
+
+               [CLSCompliantAttribute (false)]
+               public static unsafe void MemoryCopy (void* source, void* destination, ulong destinationSizeInBytes, ulong sourceBytesToCopy)
+               {
+                       if (sourceBytesToCopy > destinationSizeInBytes) {
+                               ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.sourceBytesToCopy);
+                       }
+
+                       var src = (byte*)source;
+                       var dst = (byte*)destination;
+                       while (sourceBytesToCopy > int.MaxValue) {
+                               Memcpy (dst, src, int.MaxValue);
+                               sourceBytesToCopy -= int.MaxValue;
+                               src += int.MaxValue;
+                               dst += int.MaxValue;
+                       }
+
+                       Memcpy (dst, src, (int) sourceBytesToCopy);
+               }
+
                internal static unsafe void memcpy4 (byte *dest, byte *src, int size) {
                        /*while (size >= 32) {
                                // using long is better than int and slower than double