public override bool TryAdvance(T_CONS consumer) { Objects.RequireNonNull(consumer); if (SplSpineIndex < LastSpineIndex || (SplSpineIndex == LastSpineIndex && SplElementIndex < LastSpineElementFence)) { ArrayForOne(SplChunk, SplElementIndex++, consumer); if (SplElementIndex == outerInstance.ArrayLength(SplChunk)) { SplElementIndex = 0; ++SplSpineIndex; if (outerInstance.Spine != null && SplSpineIndex <= LastSpineIndex) { SplChunk = outerInstance.Spine[SplSpineIndex]; } } return(true); } return(false); }
public override void ForEachRemaining(T_CONS consumer) { Objects.RequireNonNull(consumer); if (SplSpineIndex < LastSpineIndex || (SplSpineIndex == LastSpineIndex && SplElementIndex < LastSpineElementFence)) { int i = SplElementIndex; // completed chunks, if any for (int sp = SplSpineIndex; sp < LastSpineIndex; sp++) { T_ARR chunk = outerInstance.Spine[sp]; outerInstance.ArrayForEach(chunk, i, outerInstance.ArrayLength(chunk), consumer); i = 0; } // last (or current uncompleted) chunk T_ARR chunk = (SplSpineIndex == LastSpineIndex) ? SplChunk : outerInstance.Spine[LastSpineIndex]; outerInstance.ArrayForEach(chunk, i, LastSpineElementFence, consumer); // mark consumed SplSpineIndex = LastSpineIndex; SplElementIndex = LastSpineElementFence; } }
internal abstract void ArrayForOne(T_ARR array, int index, T_CONS consumer);