//TODO: create additional varadic Merge methods for allocation free code paths. public static Memory <FeedRangeState <TState> > Merge <TState>(IReadOnlyList <ReadOnlyMemory <FeedRangeState <TState> > > ranges) where TState : State { if (ranges == null) { throw new ArgumentNullException(nameof(ranges)); } int totalLength = 0; for (int i = 0; i < ranges.Count; i++) { totalLength += ranges[i].Length; } FeedRangeState <TState>[] feedRanges = new FeedRangeState <TState> [totalLength]; Memory <FeedRangeState <TState> > feedRangesSpan = feedRanges.AsMemory(); for (int i = 0; i < ranges.Count; i++) { ReadOnlyMemory <FeedRangeState <TState> > range = ranges[i]; range.CopyTo(feedRangesSpan); feedRangesSpan = feedRangesSpan.Slice(start: range.Length); } return(feedRanges); }
public static Memory <FeedRangeState <TState> > Merge <TState>( ReadOnlyMemory <FeedRangeState <TState> > first, ReadOnlyMemory <FeedRangeState <TState> > second, ReadOnlyMemory <FeedRangeState <TState> > third) where TState : State { FeedRangeState <TState>[] feedRanges = new FeedRangeState <TState> [first.Length + second.Length + third.Length]; Memory <FeedRangeState <TState> > feedRangesMemory = feedRanges.AsMemory(); first.CopyTo(feedRangesMemory); feedRangesMemory = feedRangesMemory.Slice(start: first.Length); second.CopyTo(feedRangesMemory); feedRangesMemory = feedRangesMemory.Slice(start: second.Length); third.CopyTo(feedRangesMemory); feedRangesMemory = feedRangesMemory.Slice(start: third.Length); return(feedRanges); }