public static int IndexOf <T>(SegmentedArray <T> array, T value, int startIndex, int count) { if ((uint)startIndex > (uint)array.Length) { ThrowHelper.ThrowStartIndexArgumentOutOfRange_ArgumentOutOfRange_Index(); } if ((uint)count > (uint)(array.Length - startIndex)) { ThrowHelper.ThrowCountArgumentOutOfRange_ArgumentOutOfRange_Count(); } var offset = startIndex; foreach (var memory in array.GetSegments(startIndex, count)) { if (!MemoryMarshal.TryGetArray <T>(memory, out var segment)) { throw new NotSupportedException(); } var index = Array.IndexOf(segment.Array !, value, segment.Offset, segment.Count); if (index >= 0) { return(index + offset - segment.Offset); } offset += segment.Count; } return(-1); }
/// <seealso cref="Array.Clear(Array, int, int)"/> internal static void Clear <T>(SegmentedArray <T> array, int index, int length) { foreach (var memory in array.GetSegments(index, length)) { memory.Span.Clear(); } }
public static void Copy<T>(SegmentedArray<T> sourceArray, Array destinationArray, int length) { if (destinationArray is null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.destinationArray); if (length == 0) return; if (length < 0) throw new ArgumentOutOfRangeException(nameof(length)); if (length > sourceArray.Length) throw new ArgumentException(SR.Arg_LongerThanSrcArray, nameof(sourceArray)); if (length > destinationArray.Length) throw new ArgumentException(SR.Arg_LongerThanDestArray, nameof(destinationArray)); var copied = 0; foreach (var memory in sourceArray.GetSegments(0, length)) { if (!MemoryMarshal.TryGetArray<T>(memory, out var segment)) { throw new NotSupportedException(); } Array.Copy(segment.Array!, sourceIndex: segment.Offset, destinationArray: destinationArray, destinationIndex: copied, length: segment.Count); copied += segment.Count; } }
public static int IndexOf <T>(SegmentedArray <T> array, T value, int startIndex, int count, IEqualityComparer <T>?comparer) { if ((uint)startIndex > (uint)array.Length) { ThrowHelper.ThrowStartIndexArgumentOutOfRange_ArgumentOutOfRange_Index(); } if ((uint)count > (uint)(array.Length - startIndex)) { ThrowHelper.ThrowCountArgumentOutOfRange_ArgumentOutOfRange_Count(); } var offset = startIndex; foreach (var memory in array.GetSegments(startIndex, count)) { if (!MemoryMarshal.TryGetArray <T>(memory, out var segment)) { throw new NotSupportedException(); } int index; if (comparer is null || comparer == EqualityComparer <T> .Default) { index = Array.IndexOf(segment.Array !, value, segment.Offset, segment.Count); }
public static void Copy<T>(SegmentedArray<T> sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) { if (destinationArray == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.destinationArray); if (typeof(T[]) != destinationArray.GetType() && destinationArray.Rank != 1) throw new RankException(SR.Rank_MustMatch); if (length < 0) throw new ArgumentOutOfRangeException(nameof(length), SR.ArgumentOutOfRange_NeedNonNegNum); if (sourceIndex < 0) throw new ArgumentOutOfRangeException(nameof(sourceIndex), SR.ArgumentOutOfRange_ArrayLB); var dstLB = destinationArray.GetLowerBound(0); if (destinationIndex < dstLB || destinationIndex - dstLB < 0) throw new ArgumentOutOfRangeException(nameof(destinationIndex), SR.ArgumentOutOfRange_ArrayLB); destinationIndex -= dstLB; if ((uint)(sourceIndex + length) > sourceArray.Length) throw new ArgumentException(SR.Arg_LongerThanSrcArray, nameof(sourceArray)); if ((uint)(destinationIndex + length) > (nuint)destinationArray.LongLength) throw new ArgumentException(SR.Arg_LongerThanDestArray, nameof(destinationArray)); var copied = 0; foreach (var memory in sourceArray.GetSegments(0, length)) { if (!MemoryMarshal.TryGetArray<T>(memory, out var segment)) { throw new NotSupportedException(); } Array.Copy(segment.Array!, sourceIndex: segment.Offset, destinationArray: destinationArray, destinationIndex: copied, length: segment.Count); copied += segment.Count; } }