@@ -169,6 +169,25 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
169169 }
170170 }
171171
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+
172191 protected void CumulativeApply ( PrimitiveColumnContainer < T > column , Func < T , T , T > func , IEnumerable < long > rows )
173192 {
174193 T ret = T . Zero ;
@@ -179,27 +198,7 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
179198 long maxCapacity = maxRange ;
180199 IEnumerator < long > enumerator = rows . GetEnumerator ( ) ;
181200
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 ;
203202 while ( enumerator . MoveNext ( ) )
204203 {
205204 long row = enumerator . Current ;
@@ -215,30 +214,18 @@ protected void CumulativeApply(PrimitiveColumnContainer<T> column, Func<T, T, T>
215214 row -= minRange ;
216215 if ( column . IsValid ( bitmap , ( int ) row ) )
217216 {
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 )
236218 {
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 ;
238226 }
239227 }
240228 }
241- return ret ;
242229 }
243230
244231 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>
251238 long maxCapacity = maxRange ;
252239 IEnumerator < long > enumerator = rows . GetEnumerator ( ) ;
253240
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 ;
275242 while ( enumerator . MoveNext ( ) )
276243 {
277244 long row = enumerator . Current ;
@@ -287,9 +254,16 @@ protected T CalculateReduction(PrimitiveColumnContainer<T> column, Func<T, T, T>
287254
288255 if ( column . IsValid ( bitMap , ( int ) row ) )
289256 {
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+ }
291266 }
292-
293267 }
294268
295269 return ret ;
0 commit comments