@@ -169,6 +169,25 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
169
169
}
170
170
}
171
171
172
+ protected T CalculateReduction ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , T startValue )
173
+ {
174
+ var ret = startValue ;
175
+
176
+ for ( int b = 0 ; b < column . Buffers . Count ; b ++ )
177
+ {
178
+ var buffer = column . Buffers [ b ] . ReadOnlySpan ;
179
+ var bitMap = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
180
+ for ( int i = 0 ; i < buffer . Length ; i ++ )
181
+ {
182
+ if ( column . IsValid ( bitMap , i ) )
183
+ {
184
+ ret = checked ( func ( ret , buffer [ i ] ) ) ;
185
+ }
186
+ }
187
+ }
188
+ return ret ;
189
+ }
190
+
172
191
protected void CumulativeApply ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , IEnumerable < long > rows )
173
192
{
174
193
T ret = T . Zero ;
@@ -179,27 +198,7 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
179
198
long maxCapacity = maxRange ;
180
199
IEnumerator < long > enumerator = rows . GetEnumerator ( ) ;
181
200
182
- bool isValid = false ;
183
- while ( ! isValid && enumerator . MoveNext ( ) )
184
- {
185
- long row = enumerator . Current ;
186
- if ( row < minRange || row >= maxRange )
187
- {
188
- int bufferIndex = ( int ) ( row / maxCapacity ) ;
189
- buffer = column . Buffers . GetOrCreateMutable ( bufferIndex ) . Span ;
190
- bitmap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
191
- minRange = checked ( bufferIndex * maxCapacity ) ;
192
- maxRange = checked ( ( bufferIndex + 1 ) * maxCapacity ) ;
193
- }
194
-
195
- row -= minRange ;
196
- if ( column . IsValid ( bitmap , ( int ) row ) )
197
- {
198
- isValid = true ;
199
- ret = buffer [ ( int ) row ] ;
200
- }
201
- }
202
-
201
+ bool isInitialized = false ;
203
202
while ( enumerator . MoveNext ( ) )
204
203
{
205
204
long row = enumerator . Current ;
@@ -215,30 +214,18 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
215
214
row -= minRange ;
216
215
if ( column . IsValid ( bitmap , ( int ) row ) )
217
216
{
218
- ret = func ( ret , buffer [ ( int ) row ] ) ;
219
- buffer [ ( int ) row ] = ret ;
220
- }
221
- }
222
- }
223
-
224
-
225
- protected T CalculateReduction ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , T startValue )
226
- {
227
- var ret = startValue ;
228
-
229
- for ( int b = 0 ; b < column . Buffers . Count ; b ++ )
230
- {
231
- var buffer = column . Buffers [ b ] . ReadOnlySpan ;
232
- var bitMap = column . NullBitMapBuffers [ b ] . ReadOnlySpan ;
233
- for ( int i = 0 ; i < buffer . Length ; i ++ )
234
- {
235
- if ( column . IsValid ( bitMap , i ) )
217
+ if ( ! isInitialized )
236
218
{
237
- ret = checked ( func ( ret , buffer [ i ] ) ) ;
219
+ isInitialized = true ;
220
+ ret = buffer [ ( int ) row ] ;
221
+ }
222
+ else
223
+ {
224
+ ret = func ( ret , buffer [ ( int ) row ] ) ;
225
+ buffer [ ( int ) row ] = ret ;
238
226
}
239
227
}
240
228
}
241
- return ret ;
242
229
}
243
230
244
231
protected T CalculateReduction ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , IEnumerable < long > rows )
@@ -251,27 +238,7 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
251
238
long maxCapacity = maxRange ;
252
239
IEnumerator < long > enumerator = rows . GetEnumerator ( ) ;
253
240
254
- bool isValid = false ;
255
- while ( ! isValid && enumerator . MoveNext ( ) )
256
- {
257
- long row = enumerator . Current ;
258
- if ( row < minRange || row >= maxRange )
259
- {
260
- int bufferIndex = ( int ) ( row / maxCapacity ) ;
261
- buffer = column . Buffers [ bufferIndex ] . ReadOnlySpan ;
262
- bitMap = column . NullBitMapBuffers [ bufferIndex ] . ReadOnlySpan ;
263
- minRange = checked ( bufferIndex * maxCapacity ) ;
264
- maxRange = checked ( ( bufferIndex + 1 ) * maxCapacity ) ;
265
- }
266
- row -= minRange ;
267
-
268
- if ( column . IsValid ( bitMap , ( int ) row ) )
269
- {
270
- isValid = true ;
271
- ret = buffer [ ( int ) row ] ;
272
- }
273
- }
274
-
241
+ bool isInitialized = false ;
275
242
while ( enumerator . MoveNext ( ) )
276
243
{
277
244
long row = enumerator . Current ;
@@ -287,9 +254,16 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
287
254
288
255
if ( column . IsValid ( bitMap , ( int ) row ) )
289
256
{
290
- ret = checked ( func ( ret , buffer [ ( int ) row ] ) ) ;
257
+ if ( ! isInitialized )
258
+ {
259
+ isInitialized = true ;
260
+ ret = buffer [ ( int ) row ] ;
261
+ }
262
+ else
263
+ {
264
+ ret = checked ( func ( ret , buffer [ ( int ) row ] ) ) ;
265
+ }
291
266
}
292
-
293
267
}
294
268
295
269
return ret ;
0 commit comments