@@ -15,8 +15,8 @@ class IncStepperA(private val size0: Long) extends NextStepper[Int] {
15
15
def knownSize = math.max(0L , size0 - i)
16
16
def hasStep = i < size0
17
17
def nextStep () = { i += 1 ; (i - 1 ).toInt }
18
- def substep () = if (( knownSize - i) <= 1 ) null else {
19
- val sub = new IncStepperA (i + (size0 - i)/ 2 )
18
+ def substep () = if (knownSize <= 1 ) null else {
19
+ val sub = new IncStepperA (size0 - (size0 - i)/ 2 )
20
20
sub.i = i
21
21
i = sub.size0
22
22
sub
@@ -29,9 +29,9 @@ class IncStepperB(private val size0: Long) extends TryStepper[Int] {
29
29
protected var myCache : Int = 0
30
30
private var i = 0L
31
31
def characteristics = Stepper .Sized | Stepper .SubSized | Stepper .Ordered
32
- def knownSize = math.max(0L , size0 - i)
32
+ def knownUncachedSize = math.max(0L , size0 - i)
33
33
protected def tryUncached (f : Int => Unit ): Boolean = if (i >= size0) false else { f(i.toInt); i += 1 ; true }
34
- def substep () = if (( knownSize - i) <= 1 ) null else {
34
+ def substep () = if (knownSize <= 1 ) null else {
35
35
val sub = new IncStepperB (size0 - (size0 - i)/ 2 )
36
36
sub.i = i
37
37
i = sub.size0
@@ -41,6 +41,7 @@ class IncStepperB(private val size0: Long) extends TryStepper[Int] {
41
41
}
42
42
43
43
class IncSpliterator (private val size0 : Long ) extends Spliterator .OfInt {
44
+ if (size0 < 0 ) throw new IllegalArgumentException (" Size must be >= 0L" )
44
45
private var i = 0L
45
46
def characteristics () = Stepper .Sized | Stepper .SubSized | Stepper .Ordered
46
47
def estimateSize () = math.max(0L , size0 - i)
@@ -123,15 +124,27 @@ class StepperTest {
123
124
}
124
125
125
126
val sizes = Vector (0 , 1 , 2 , 4 , 15 , 17 , 2512 )
126
- def sources : Vector [(Int , Stepper [Int ])] = sizes.flatMap(i => Vector (
127
- i -> new IncStepperA (i),
128
- i -> new IncStepperB (i),
129
- i -> Stepper .ofSpliterator(new IncSpliterator (i)),
130
- i -> new MappingStepper [Int ,Int ](new IncStepperA (i), x => x),
131
- i -> new MappingStepper [Long , Int ](Stepper .ofSpliterator(new IntToLongSpliterator (new IncSpliterator (i), _.toLong)), _.toInt),
132
- i -> new MappingStepper [Double , Int ](Stepper .ofSpliterator(new IntToDoubleSpliterator (new IncSpliterator (i), _.toDouble)), _.toInt),
133
- i -> new MappingStepper [String , Int ](Stepper .ofSpliterator(new IntToGenericSpliterator [String ](new IncSpliterator (i), _.toString)), _.toInt)
134
- ))
127
+ def sources : Vector [(Int , Stepper [Int ])] = sizes.flatMap{ i =>
128
+ Vector (
129
+ i -> new IncStepperA (i),
130
+ i -> new IncStepperB (i),
131
+ i -> Stepper .ofSpliterator(new IncSpliterator (i)),
132
+ i -> new MappingStepper [Int ,Int ](new IncStepperA (i), x => x),
133
+ i -> new MappingStepper [Long , Int ](Stepper .ofSpliterator(new IntToLongSpliterator (new IncSpliterator (i), _.toLong)), _.toInt),
134
+ i -> new MappingStepper [Double , Int ](Stepper .ofSpliterator(new IntToDoubleSpliterator (new IncSpliterator (i), _.toDouble)), _.toInt),
135
+ i -> new MappingStepper [String , Int ](Stepper .ofSpliterator(new IntToGenericSpliterator [String ](new IncSpliterator (i), _.toString)), _.toInt)
136
+ ) ++
137
+ {
138
+ // Implicitly converted instead of explicitly
139
+ import SpliteratorConverters ._
140
+ Vector [(Int , Stepper [Int ])](
141
+ i -> (new IncSpliterator (i)).stepper,
142
+ i -> new MappingStepper [Long , Int ]((new IntToLongSpliterator (new IncSpliterator (i), _.toLong)).stepper, _.toInt),
143
+ i -> new MappingStepper [Double , Int ]((new IntToDoubleSpliterator (new IncSpliterator (i), _.toDouble)).stepper, _.toInt),
144
+ i -> new MappingStepper [String , Int ]((new IntToGenericSpliterator [String ](new IncSpliterator (i), _.toString)).stepper, _.toInt)
145
+ )
146
+ }
147
+ }
135
148
136
149
@ Test
137
150
def stepping () {
@@ -177,12 +190,33 @@ class StepperTest {
177
190
if (ss != null ) {
178
191
assertTrue(s.hasStep)
179
192
assertTrue(ss.hasStep)
180
- assertEquals(i, s.count + ss.count)
193
+ val c1 = s.count
194
+ val c2 = ss.count
195
+ assertEquals(s " $i != $c1 + $c2 from ${s.getClass.getName}" , i, c1 + c2)
181
196
}
182
197
else assertEquals(i, s.count)
183
198
}
184
199
}
185
200
201
+ @ Test
202
+ def characteristically () {
203
+ val expected = Stepper .Sized | Stepper .SubSized | Stepper .Ordered
204
+ sources.foreach{ case (_,s) => assertEquals(s.characteristics, expected)}
205
+ sources.foreach{ case (_,s) => subs(0 )(s)(x => { assertEquals(x.characteristics, expected); 0 }, _ + _) }
206
+ }
207
+
208
+ @ Test
209
+ def knownSizes () {
210
+ sources.foreach{ case (i,s) => assertEquals(i.toLong, s.knownSize) }
211
+ sources.foreach{ case (i,s) => if (i > 0 ) subs(0 )(s)(x => { assertEquals(x.knownSize, 1L ); 0 }, _ + _) }
212
+ }
213
+
214
+ @ Test
215
+ def consistentPrecision () {
216
+ sources.foreach{ case (_,s) => assert(s eq s.typedPrecisely) }
217
+ sources.foreach{ case (_,s) => subs(0 )(s)(x => { assert(x eq x.typedPrecisely); 0 }, _ + _) }
218
+ }
219
+
186
220
@ Test
187
221
def count_only () {
188
222
sources.foreach{ case (i, s) => assertEquals(i, s.count) }
0 commit comments