@@ -33,7 +33,7 @@ public void Any(PrimitiveColumnContainer<T> column, out bool ret)
3333
3434 public void CumulativeMax ( PrimitiveColumnContainer < T > column )
3535 {
36- CumulativeApply ( column , T . Max ) ;
36+ CumulativeApply ( column , T . Max , column . Buffers [ 0 ] . ReadOnlySpan [ 0 ] ) ;
3737 }
3838
3939 public void CumulativeMax ( PrimitiveColumnContainer < T > column , IEnumerable < long > rows )
@@ -43,7 +43,7 @@ public void CumulativeMax(PrimitiveColumnContainer<T> column, IEnumerable<long>
4343
4444 public void CumulativeMin ( PrimitiveColumnContainer < T > column )
4545 {
46- CumulativeApply ( column , T . Min ) ;
46+ CumulativeApply ( column , T . Min , column . Buffers [ 0 ] . ReadOnlySpan [ 0 ] ) ;
4747 }
4848
4949 public void CumulativeMin ( PrimitiveColumnContainer < T > column , IEnumerable < long > rows )
@@ -139,55 +139,41 @@ protected void Apply(PrimitiveColumnContainer<T> column, Func<T, T> func)
139139 {
140140 for ( int b = 0 ; b < column . Buffers . Count ; b ++ )
141141 {
142- var buffer = column . Buffers [ b ] ;
143- var mutableBuffer = DataFrameBuffer < T > . GetMutableBuffer ( buffer ) ;
144- var mutableSpan = mutableBuffer . Span ;
145-
146- var nullBitMapBuffer = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
147- for ( int i = 0 ; i < mutableSpan . Length ; i ++ )
142+ var buffer = column . Buffers . GetOrCreateMutable ( b ) . Span ;
143+ var bitmap = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
144+ for ( int i = 0 ; i < buffer . Length ; i ++ )
148145 {
149- if ( column . IsValid ( nullBitMapBuffer , i ) )
146+ if ( column . IsValid ( bitmap , i ) )
150147 {
151- mutableSpan [ i ] = func ( mutableSpan [ i ] ) ;
148+ buffer [ i ] = func ( buffer [ i ] ) ;
152149 }
153150 }
154- column . Buffers [ b ] = mutableBuffer ;
155151 }
156152 }
157153
158- protected void CumulativeApply ( PrimitiveColumnContainer < T > column , Func < T , T , T > func )
159- {
160- CumulativeApply ( column , func , column . Buffers [ 0 ] . ReadOnlySpan [ 0 ] ) ;
161- }
162-
163154 protected void CumulativeApply ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , T startingValue )
164155 {
165156 T ret = startingValue ;
166157 for ( int b = 0 ; b < column . Buffers . Count ; b ++ )
167158 {
168- var buffer = column . Buffers [ b ] ;
169- var mutableBuffer = DataFrameBuffer < T > . GetMutableBuffer ( buffer ) ;
170- var mutableSpan = mutableBuffer . Span ;
171-
172- var nullBitMapBuffer = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
173- for ( int i = 0 ; i < mutableSpan . Length ; i ++ )
159+ var buffer = column . Buffers . GetOrCreateMutable ( b ) . Span ;
160+ var bitmap = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
161+ for ( int i = 0 ; i < buffer . Length ; i ++ )
174162 {
175- if ( column . IsValid ( nullBitMapBuffer , i ) )
163+ if ( column . IsValid ( bitmap , i ) )
176164 {
177- ret = func ( mutableSpan [ i ] , ret ) ;
178- mutableSpan [ i ] = ret ;
165+ ret = func ( buffer [ i ] , ret ) ;
166+ buffer [ i ] = ret ;
179167 }
180168 }
181- column . Buffers [ b ] = mutableBuffer ;
182169 }
183170 }
184171
185172 protected void CumulativeApply ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , IEnumerable < long > rows )
186173 {
187174 T ret = T . Zero ;
188- var mutableBuffer = column . Buffers . GetOrCreateMutable ( 0 ) ;
189- var nullBitMap = column . NullBitMapBuffers . GetOrCreateMutable ( 0 ) ;
190- var span = mutableBuffer . Span ;
175+ var buffer = column . Buffers . GetOrCreateMutable ( 0 ) . Span ;
176+ var bitmap = column . NullBitMapBuffers [ 0 ] . ReadOnlySpan ;
191177 long minRange = 0 ;
192178 long maxRange = ReadOnlyDataFrameBuffer < T > . MaxCapacity ;
193179 long maxCapacity = maxRange ;
@@ -200,18 +186,17 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
200186 if ( row < minRange || row >= maxRange )
201187 {
202188 int bufferIndex = ( int ) ( row / maxCapacity ) ;
203- mutableBuffer = column . Buffers . GetOrCreateMutable ( bufferIndex ) ;
204- nullBitMap = column . NullBitMapBuffers . GetOrCreateMutable ( bufferIndex ) ;
205- span = mutableBuffer . Span ;
189+ buffer = column . Buffers . GetOrCreateMutable ( bufferIndex ) . Span ;
190+ bitmap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
206191 minRange = checked ( bufferIndex * maxCapacity ) ;
207192 maxRange = checked ( ( bufferIndex + 1 ) * maxCapacity ) ;
208193 }
209194
210195 row -= minRange ;
211- if ( column . IsValid ( nullBitMap . Span , ( int ) row ) )
196+ if ( column . IsValid ( bitmap , ( int ) row ) )
212197 {
213198 isValid = true ;
214- ret = span [ ( int ) row ] ;
199+ ret = buffer [ ( int ) row ] ;
215200 }
216201 }
217202
@@ -221,18 +206,17 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
221206 if ( row < minRange || row >= maxRange )
222207 {
223208 int bufferIndex = ( int ) ( row / maxCapacity ) ;
224- mutableBuffer = column . Buffers . GetOrCreateMutable ( bufferIndex ) ;
225- nullBitMap = column . NullBitMapBuffers . GetOrCreateMutable ( bufferIndex ) ;
226- span = mutableBuffer . Span ;
209+ buffer = column . Buffers . GetOrCreateMutable ( bufferIndex ) . Span ;
210+ bitmap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
227211 minRange = checked ( bufferIndex * maxCapacity ) ;
228212 maxRange = checked ( ( bufferIndex + 1 ) * maxCapacity ) ;
229213 }
230214
231215 row -= minRange ;
232- if ( column . IsValid ( nullBitMapBuffer , i ) )
216+ if ( column . IsValid ( bitmap , ( int ) row ) )
233217 {
234- ret = func ( ret , readonlySpan [ i ] ) ;
235- span [ ( int ) row ] = ret ;
218+ ret = func ( ret , buffer [ ( int ) row ] ) ;
219+ buffer [ ( int ) row ] = ret ;
236220 }
237221 }
238222 }
@@ -244,13 +228,13 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
244228
245229 for ( int b = 0 ; b < column . Buffers . Count ; b ++ )
246230 {
247- var readonlySpan = column . Buffers [ b ] . ReadOnlySpan ;
248- var nullBitMapBuffer = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
249- for ( int i = 0 ; i < readonlySpan . Length ; i ++ )
231+ var buffer = column . Buffers [ b ] . ReadOnlySpan ;
232+ var bitMap = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
233+ for ( int i = 0 ; i < buffer . Length ; i ++ )
250234 {
251- if ( column . IsValid ( nullBitMapBuffer , i ) )
235+ if ( column . IsValid ( bitMap , i ) )
252236 {
253- ret = func ( ret , readonlySpan [ i ] ) ;
237+ ret = checked ( func ( ret , buffer [ i ] ) ) ;
254238 }
255239 }
256240 }
@@ -260,8 +244,8 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
260244 protected T CalculateReduction ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , IEnumerable < long > rows )
261245 {
262246 var ret = T . Zero ;
263- var readOnlySpan = column . Buffers [ 0 ] . ReadOnlySpan ;
264- var readOnlyNullBitMap = column . NullBitMapBuffers [ 0 ] . ReadOnlySpan ;
247+ var buffer = column . Buffers [ 0 ] . ReadOnlySpan ;
248+ var bitMap = column . NullBitMapBuffers [ 0 ] . ReadOnlySpan ;
265249 long minRange = 0 ;
266250 long maxRange = ReadOnlyDataFrameBuffer < T > . MaxCapacity ;
267251 long maxCapacity = maxRange ;
@@ -274,17 +258,17 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
274258 if ( row < minRange || row >= maxRange )
275259 {
276260 int bufferIndex = ( int ) ( row / maxCapacity ) ;
277- readOnlySpan = column . Buffers [ bufferIndex ] . ReadOnlySpan ;
278- readOnlyNullBitMap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
261+ buffer = column . Buffers [ bufferIndex ] . ReadOnlySpan ;
262+ bitMap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
279263 minRange = checked ( bufferIndex * maxCapacity ) ;
280264 maxRange = checked ( ( bufferIndex + 1 ) * maxCapacity ) ;
281265 }
282266 row -= minRange ;
283267
284- if ( column . IsValid ( readOnlyNullBitMap , ( int ) row ) )
268+ if ( column . IsValid ( bitMap , ( int ) row ) )
285269 {
286270 isValid = true ;
287- ret = readOnlySpan [ ( int ) row ] ;
271+ ret = buffer [ ( int ) row ] ;
288272 }
289273 }
290274
@@ -294,14 +278,18 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
294278 if ( row < minRange || row >= maxRange )
295279 {
296280 int bufferIndex = ( int ) ( row / maxCapacity ) ;
297- readOnlySpan = column . Buffers [ bufferIndex ] . ReadOnlySpan ;
298- readOnlyNullBitMap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
281+ buffer = column . Buffers [ bufferIndex ] . ReadOnlySpan ;
282+ bitMap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
299283 minRange = checked ( bufferIndex * maxCapacity ) ;
300284 maxRange = checked ( ( bufferIndex + 1 ) * maxCapacity ) ;
301285 }
302286 row -= minRange ;
303287
304- ret = checked ( func ( readOnlySpan [ ( int ) row ] , ret ) ) ;
288+ if ( column . IsValid ( bitMap , ( int ) row ) )
289+ {
290+ ret = checked ( func ( ret , buffer [ ( int ) row ] ) ) ;
291+ }
292+
305293 }
306294
307295 return ret ;
0 commit comments