예제 #1
0
        public static unsafe void Copy <T>(BufferSpan <T> source, BufferSpan <T> destination, int count)
            where T : struct
        {
            DebugGuard.MustBeLessThanOrEqualTo(count, source.Length, nameof(count));
            DebugGuard.MustBeLessThanOrEqualTo(count, destination.Length, nameof(count));

            ref byte srcRef  = ref Unsafe.As <T, byte>(ref source.DangerousGetPinnableReference());
예제 #2
0
        public BufferSpan(T[] array, int start)
        {
            GuardArray(array);
            DebugGuard.MustBeLessThanOrEqualTo(start, array.Length, nameof(start));

            this.Array  = array;
            this.Length = array.Length - start;
            this.Start  = start;
        }
예제 #3
0
        public BufferSpan(T[] array, void *pointerToArray, int start)
        {
            GuardArrayAndPointer(array, pointerToArray);
            DebugGuard.MustBeLessThanOrEqualTo(start, array.Length, nameof(start));

            this.Array           = array;
            this.Length          = array.Length - start;
            this.Start           = start;
            this.PointerAtOffset = (IntPtr)pointerToArray + (Unsafe.SizeOf <T>() * start);
        }
예제 #4
0
        public void Clear(int count)
        {
            DebugGuard.MustBeLessThanOrEqualTo(count, this.Length, nameof(count));

            if (count < 256)
            {
                Unsafe.InitBlock((void *)this.PointerAtOffset, 0, BufferSpan.USizeOf <T>(count));
            }
            else
            {
                System.Array.Clear(this.Array, this.Start, count);
            }
        }
예제 #5
0
        public BufferSpan <T> Slice(int start, int length)
        {
            DebugGuard.MustBeLessThanOrEqualTo(start, this.Length, nameof(start));
            DebugGuard.MustBeLessThanOrEqualTo(length, this.Length - start, nameof(length));

            BufferSpan <T> result = default(BufferSpan <T>);

            result.Array           = this.Array;
            result.Start           = this.Start + start;
            result.PointerAtOffset = this.PointerAtOffset + (Unsafe.SizeOf <T>() * start);
            result.Length          = length;
            return(result);
        }