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); } } }
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)); } } }
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); } } }
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); } } }