Esempio n. 1
0
        public void GetArrayOrPointer()
        {
            var original = new int[] { 1, 2, 3 };
            ArraySegment <int> array;
            UnsafeMemory <int> slice;

            slice = new UnsafeMemory <int>(original, 1, 2);
            Assert.True(slice.TryGetArray(out array));
            Assert.Equal(2, array.Array[array.Offset + 0]);
            Assert.Equal(3, array.Array[array.Offset + 1]);

            slice = new UnsafeMemory <int>(original, 0, 3);
            Assert.True(slice.TryGetArray(out array));
            Assert.Equal(1, array.Array[array.Offset + 0]);
            Assert.Equal(2, array.Array[array.Offset + 1]);
            Assert.Equal(3, array.Array[array.Offset + 2]);

            slice = new UnsafeMemory <int>(original, 0, 0);
            Assert.True(slice.TryGetArray(out array));
            Assert.Equal(0, array.Offset);
            Assert.Equal(original, array.Array);
            Assert.Equal(0, array.Count);

            unsafe
            {
                fixed(int *pBytes = original)
                {
                    slice = new UnsafeMemory <int>(pBytes, 1);
                    Assert.False(slice.TryGetArray(out array));
                    void *p;

                    Assert.True(slice.TryGetPointer(out p));
                    Assert.True(null != p);
                    Assert.Equal(null, array.Array);
                    Assert.Equal(0, array.Offset);
                    Assert.Equal(0, array.Count);
                }
            }

            unsafe
            {
                fixed(int *pBytes = original)
                {
                    var roSlice = new ReadOnlySpan <int>(pBytes, 1);

                    Assert.False(slice.TryGetArray(out array));
                    void *p;

                    Assert.True(slice.TryGetPointer(out p));
                    Assert.True(null != p);
                    Assert.Equal(null, array.Array);
                    Assert.Equal(0, array.Offset);
                    Assert.Equal(0, array.Count);
                }
            }
        }
Esempio n. 2
0
 public int Send(UnsafeMemory <byte> buffer)
 {
     // This can work with Span<byte> because it's synchronous but we need pinning support
     unsafe {
         ArraySegment <byte> segment;
         if (buffer.TryGetArray(out segment))
         {
             return(Send(segment));
         }
         else
         {
             void *pointer;
             buffer.TryGetPointer(out pointer);
             return(SendPinned(new IntPtr(pointer), buffer.Length));
         }
     }
 }
Esempio n. 3
0
 public int Receive(UnsafeMemory<byte> buffer)
 {
     // This can work with Span<byte> because it's synchronous but we need pinning support
     unsafe
     {
         ArraySegment<byte> segment;
         if (buffer.TryGetArray(out segment)) {
             return Receive(segment);
         }
         else {
             void* pointer;
             buffer.TryGetPointer(out pointer);
             return ReceivePinned(new IntPtr(pointer), buffer.Length);
         }
     }
 }
Esempio n. 4
0
        public void GetArrayOrPointer()
        {
            var original = new int[] { 1, 2, 3 };
            ArraySegment<int> array;
            UnsafeMemory<int> slice;

            slice = new UnsafeMemory<int>(original, 1, 2);
            Assert.True(slice.TryGetArray(out array));
            Assert.Equal(2, array.Array[array.Offset + 0]);
            Assert.Equal(3, array.Array[array.Offset + 1]);

            slice = new UnsafeMemory<int>(original, 0, 3);
            Assert.True(slice.TryGetArray(out array));
            Assert.Equal(1, array.Array[array.Offset + 0]);
            Assert.Equal(2, array.Array[array.Offset + 1]);
            Assert.Equal(3, array.Array[array.Offset + 2]);

            slice = new UnsafeMemory<int>(original, 0, 0);
            Assert.True(slice.TryGetArray(out array));
            Assert.Equal(0, array.Offset);
            Assert.Equal(original, array.Array);
            Assert.Equal(0, array.Count);

            unsafe
            {
                fixed (int* pBytes = original)
                {
                    slice = new UnsafeMemory<int>(pBytes, 1);
                    Assert.False(slice.TryGetArray(out array));
                    void* p;
                    Assert.True(slice.TryGetPointer(out p));
                    Assert.True(null != p);
                    Assert.Equal(null, array.Array);
                    Assert.Equal(0, array.Offset);
                    Assert.Equal(0, array.Count);
                }
            }

            unsafe
            {
                fixed (int* pBytes = original)
                {
                    var roSlice = new ReadOnlySpan<int>(pBytes, 1);
                    Assert.False(slice.TryGetArray(out array));
                    void* p;
                    Assert.True(slice.TryGetPointer(out p));
                    Assert.True(null != p);
                    Assert.Equal(null, array.Array);
                    Assert.Equal(0, array.Offset);
                    Assert.Equal(0, array.Count);
                }
            }
        }