public void CumulativeMax(PrimitiveColumnContainer <DateTime> column) { var ret = column.Buffers[0].ReadOnlySpan[0]; for (int b = 0; b < column.Buffers.Count; b++) { var buffer = column.Buffers[b]; var mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(buffer); var mutableSpan = mutableBuffer.Span; var readOnlySpan = buffer.ReadOnlySpan; for (int i = 0; i < readOnlySpan.Length; i++) { var val = readOnlySpan[i]; if (val > ret) { ret = val; } mutableSpan[i] = ret; } column.Buffers[b] = mutableBuffer; } }
public void CumulativeMax(PrimitiveColumnContainer <DateTime> column, IEnumerable <long> rows) { var ret = default(DateTime); var mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(column.Buffers[0]); var span = mutableBuffer.Span; long minRange = 0; long maxRange = ReadOnlyDataFrameBuffer <DateTime> .MaxCapacity; long maxCapacity = maxRange; IEnumerator <long> enumerator = rows.GetEnumerator(); if (enumerator.MoveNext()) { long row = enumerator.Current; if (row < minRange || row >= maxRange) { int bufferIndex = (int)(row / maxCapacity); mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(column.Buffers[bufferIndex]); span = mutableBuffer.Span; minRange = checked (bufferIndex * maxCapacity); maxRange = checked ((bufferIndex + 1) * maxCapacity); } row -= minRange; ret = span[(int)row]; } while (enumerator.MoveNext()) { long row = enumerator.Current; if (row < minRange || row >= maxRange) { int bufferIndex = (int)(row / maxCapacity); mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(column.Buffers[bufferIndex]); span = mutableBuffer.Span; minRange = checked (bufferIndex * maxCapacity); maxRange = checked ((bufferIndex + 1) * maxCapacity); } row -= minRange; var val = span[(int)row]; if (val > ret) { ret = val; } span[(int)row] = ret; } }