/// <summary> /// Initializes a new instance of the <see cref="Span2D{T}"/> struct wrapping a 2D array. /// </summary> /// <param name="array">The given 2D array to wrap.</param> /// <param name="row">The target row to map within <paramref name="array"/>.</param> /// <param name="column">The target column to map within <paramref name="array"/>.</param> /// <param name="height">The height to map within <paramref name="array"/>.</param> /// <param name="width">The width to map within <paramref name="array"/>.</param> /// <exception cref="ArrayTypeMismatchException"> /// Thrown when <paramref name="array"/> doesn't match <typeparamref name="T"/>. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// Thrown when either <paramref name="height"/>, <paramref name="width"/> or <paramref name="height"/> /// are negative or not within the bounds that are valid for <paramref name="array"/>. /// </exception> public Span2D(T[, ]?array, int row, int column, int height, int width) { if (array is null) { if (row != 0 || column != 0 || height != 0 || width != 0) { ThrowHelper.ThrowArgumentException(); } this = default; return; } if (array.IsCovariant()) { ThrowHelper.ThrowArrayTypeMismatchException(); } int rows = array.GetLength(0), columns = array.GetLength(1); if ((uint)row >= (uint)rows) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForRow(); } if ((uint)column >= (uint)columns) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForColumn(); } if ((uint)height > (uint)(rows - row)) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForHeight(); } if ((uint)width > (uint)(columns - column)) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForWidth(); } #if SPAN_RUNTIME_SUPPORT this.span = MemoryMarshal.CreateSpan(ref array.DangerousGetReferenceAt(row, column), height); #else this.Instance = array; this.Offset = array.DangerousGetObjectDataByteOffset(ref array.DangerousGetReferenceAt(row, column)); this.height = height; #endif this.width = width; this.Stride = columns; }
public static int GetBinaryHashCode <T>(this T[, ]?array) where T : unmanaged { if (array is null) { return(0); } fixed(T *pArray = array) { var size = sizeof(T) * array.Length; return(BinaryEqualityComparer.GetHashCode(pArray, size)); } }
/// <summary> /// Initializes a new instance of the <see cref="Memory2D{T}"/> struct wrapping a 2D array. /// </summary> /// <param name="array">The given 2D array to wrap.</param> /// <param name="row">The target row to map within <paramref name="array"/>.</param> /// <param name="column">The target column to map within <paramref name="array"/>.</param> /// <param name="height">The height to map within <paramref name="array"/>.</param> /// <param name="width">The width to map within <paramref name="array"/>.</param> /// <exception cref="ArrayTypeMismatchException"> /// Thrown when <paramref name="array"/> doesn't match <typeparamref name="T"/>. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// Thrown when either <paramref name="height"/>, <paramref name="width"/> or <paramref name="height"/> /// are negative or not within the bounds that are valid for <paramref name="array"/>. /// </exception> public Memory2D(T[, ]?array, int row, int column, int height, int width) { if (array is null) { if (row != 0 || column != 0 || height != 0 || width != 0) { ThrowHelper.ThrowArgumentException(); } this = default; return; } if (array.IsCovariant()) { ThrowHelper.ThrowArrayTypeMismatchException(); } int rows = array.GetLength(0), columns = array.GetLength(1); if ((uint)row >= (uint)rows) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForRow(); } if ((uint)column >= (uint)columns) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForColumn(); } if ((uint)height > (uint)(rows - row)) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForHeight(); } if ((uint)width > (uint)(columns - column)) { ThrowHelper.ThrowArgumentOutOfRangeExceptionForWidth(); } this.instance = array; this.offset = array.DangerousGetObjectDataByteOffset(ref array.DangerousGetReferenceAt(row, column)); this.height = height; this.width = width; this.pitch = columns - width; }
/// <summary> /// Initializes a new instance of the <see cref="ReadOnlyMemory2D{T}"/> struct wrapping a 2D array. /// </summary> /// <param name="array">The given 2D array to wrap.</param> public ReadOnlyMemory2D(T[, ]?array) { if (array is null) { this = default; return; } this.instance = array; this.offset = GetArray2DDataByteOffset <T>(); this.height = array.GetLength(0); this.width = array.GetLength(1); this.pitch = 0; }
/// <summary> /// Initializes a new instance of the <see cref="Memory2D{T}"/> struct wrapping a 2D array. /// </summary> /// <param name="array">The given 2D array to wrap.</param> /// <exception cref="ArrayTypeMismatchException"> /// Thrown when <paramref name="array"/> doesn't match <typeparamref name="T"/>. /// </exception> public Memory2D(T[, ]?array) { if (array is null) { this = default; return; } if (array.IsCovariant()) { ThrowHelper.ThrowArrayTypeMismatchException(); } this.instance = array; this.offset = GetArray2DDataByteOffset <T>(); this.height = array.GetLength(0); this.width = array.GetLength(1); this.pitch = 0; }
public static bool BinaryEquals <T>(this T[, ]?array, T[, ]?other) where T : unmanaged { if (object.ReferenceEquals(array, other)) { return(true); } if ((array is null) || (other is null)) { return(false); } if (array.Length != other.Length) { return(false); } fixed(T *pArray = array, pOther = other) { var size = sizeof(T) * array.Length; return(BinaryEqualityComparer.Equals(pArray, pOther, size)); } }
/// <summary> /// Initializes a new instance of the <see cref="Span2D{T}"/> struct wrapping a 2D array. /// </summary> /// <param name="array">The given 2D array to wrap.</param> /// <exception cref="ArrayTypeMismatchException"> /// Thrown when <paramref name="array"/> doesn't match <typeparamref name="T"/>. /// </exception> public Span2D(T[, ]?array) { if (array is null) { this = default; return; } if (array.IsCovariant()) { ThrowHelper.ThrowArrayTypeMismatchException(); } #if SPAN_RUNTIME_SUPPORT this.span = MemoryMarshal.CreateSpan(ref array.DangerousGetReference(), array.GetLength(0)); #else this.Instance = array; this.Offset = array.DangerousGetObjectDataByteOffset(ref array.DangerousGetReferenceAt(0, 0)); this.height = array.GetLength(0); #endif this.width = this.Stride = array.GetLength(1); }