@@ -37,7 +37,7 @@ trait Set[A] extends Iterable[A]
37
37
{
38
38
override def companion : GenericCompanion [Set ] = Set
39
39
40
-
40
+
41
41
/** Returns this $coll as an immutable set, perhaps accepting a
42
42
* wider range of elements. Since it already is an
43
43
* immutable set, it will only be rebuilt if the underlying structure
@@ -54,7 +54,7 @@ trait Set[A] extends Iterable[A]
54
54
foreach(sb += _)
55
55
sb.result()
56
56
}
57
-
57
+
58
58
override def seq : Set [A ] = this
59
59
protected override def parCombiner = ParSet .newCombiner[A ] // if `immutable.SetLike` gets introduced, please move this there!
60
60
}
@@ -106,6 +106,29 @@ object Set extends ImmutableSetFactory[Set] {
106
106
}
107
107
private [collection] def emptyInstance : Set [Any ] = EmptySet
108
108
109
+ @ SerialVersionUID (3L )
110
+ private abstract class SetNIterator [A ](n : Int ) extends AbstractIterator [A ] with Serializable {
111
+ private [this ] var current = 0
112
+ private [this ] var remainder = n
113
+ def hasNext = remainder > 0
114
+ def apply (i : Int ): A
115
+ def next (): A =
116
+ if (hasNext) {
117
+ val r = apply(current)
118
+ current += 1
119
+ remainder -= 1
120
+ r
121
+ } else Iterator .empty.next()
122
+
123
+ override def drop (n : Int ): Iterator [A ] = {
124
+ if (n > 0 ) {
125
+ current += n
126
+ remainder = Math .max(0 , remainder - n)
127
+ }
128
+ this
129
+ }
130
+ }
131
+
109
132
/** An optimized representation for immutable sets of size 1 */
110
133
@ SerialVersionUID (1233385750652442003L )
111
134
class Set1 [A ] private [collection] (elem1 : A ) extends AbstractSet [A ] with Set [A ] with Serializable {
@@ -119,7 +142,7 @@ object Set extends ImmutableSetFactory[Set] {
119
142
if (elem == elem1) Set .empty
120
143
else this
121
144
def iterator : Iterator [A ] =
122
- Iterator (elem1)
145
+ Iterator .single (elem1)
123
146
override def foreach [U ](f : A => U ): Unit = {
124
147
f(elem1)
125
148
}
@@ -129,6 +152,8 @@ object Set extends ImmutableSetFactory[Set] {
129
152
override def forall (@ deprecatedName(' f ) p : A => Boolean ): Boolean = {
130
153
p(elem1)
131
154
}
155
+ override private [scala] def filterImpl (pred : A => Boolean , isFlipped : Boolean ): Set [A ] =
156
+ if (pred(elem1) != isFlipped) this else Set .empty
132
157
override def find (@ deprecatedName(' f ) p : A => Boolean ): Option [A ] = {
133
158
if (p(elem1)) Some (elem1)
134
159
else None
@@ -153,8 +178,11 @@ object Set extends ImmutableSetFactory[Set] {
153
178
if (elem == elem1) new Set1 (elem2)
154
179
else if (elem == elem2) new Set1 (elem1)
155
180
else this
156
- def iterator : Iterator [A ] =
157
- Iterator (elem1, elem2)
181
+ def iterator : Iterator [A ] = new SetNIterator [A ](size) {
182
+ def apply (i : Int ) = getElem(i)
183
+ }
184
+ private def getElem (i : Int ) = i match { case 0 => elem1 case 1 => elem2 }
185
+
158
186
override def foreach [U ](f : A => U ): Unit = {
159
187
f(elem1); f(elem2)
160
188
}
@@ -164,6 +192,18 @@ object Set extends ImmutableSetFactory[Set] {
164
192
override def forall (@ deprecatedName(' f ) p : A => Boolean ): Boolean = {
165
193
p(elem1) && p(elem2)
166
194
}
195
+ override private [scala] def filterImpl (pred : A => Boolean , isFlipped : Boolean ): Set [A ] = {
196
+ var r1 : A = null .asInstanceOf [A ]
197
+ var n = 0
198
+ if (pred(elem1) != isFlipped) { r1 = elem1; n += 1 }
199
+ if (pred(elem2) != isFlipped) { if (n == 0 ) r1 = elem2; n += 1 }
200
+
201
+ n match {
202
+ case 0 => Set .empty
203
+ case 1 => new Set1 (r1)
204
+ case 2 => this
205
+ }
206
+ }
167
207
override def find (@ deprecatedName(' f ) p : A => Boolean ): Option [A ] = {
168
208
if (p(elem1)) Some (elem1)
169
209
else if (p(elem2)) Some (elem2)
@@ -190,8 +230,11 @@ object Set extends ImmutableSetFactory[Set] {
190
230
else if (elem == elem2) new Set2 (elem1, elem3)
191
231
else if (elem == elem3) new Set2 (elem1, elem2)
192
232
else this
193
- def iterator : Iterator [A ] =
194
- Iterator (elem1, elem2, elem3)
233
+ def iterator : Iterator [A ] = new SetNIterator [A ](size) {
234
+ def apply (i : Int ) = getElem(i)
235
+ }
236
+ private def getElem (i : Int ) = i match { case 0 => elem1 case 1 => elem2 case 2 => elem3 }
237
+
195
238
override def foreach [U ](f : A => U ): Unit = {
196
239
f(elem1); f(elem2); f(elem3)
197
240
}
@@ -201,6 +244,20 @@ object Set extends ImmutableSetFactory[Set] {
201
244
override def forall (@ deprecatedName(' f ) p : A => Boolean ): Boolean = {
202
245
p(elem1) && p(elem2) && p(elem3)
203
246
}
247
+ override private [scala] def filterImpl (pred : A => Boolean , isFlipped : Boolean ): Set [A ] = {
248
+ var r1, r2 : A = null .asInstanceOf [A ]
249
+ var n = 0
250
+ if (pred(elem1) != isFlipped) { r1 = elem1; n += 1 }
251
+ if (pred(elem2) != isFlipped) { if (n == 0 ) r1 = elem2 else r2 = elem2; n += 1 }
252
+ if (pred(elem3) != isFlipped) { if (n == 0 ) r1 = elem3 else if (n == 1 ) r2 = elem3; n += 1 }
253
+
254
+ n match {
255
+ case 0 => Set .empty
256
+ case 1 => new Set1 (r1)
257
+ case 2 => new Set2 (r1, r2)
258
+ case 3 => this
259
+ }
260
+ }
204
261
override def find (@ deprecatedName(' f ) p : A => Boolean ): Option [A ] = {
205
262
if (p(elem1)) Some (elem1)
206
263
else if (p(elem2)) Some (elem2)
@@ -229,8 +286,11 @@ object Set extends ImmutableSetFactory[Set] {
229
286
else if (elem == elem3) new Set3 (elem1, elem2, elem4)
230
287
else if (elem == elem4) new Set3 (elem1, elem2, elem3)
231
288
else this
232
- def iterator : Iterator [A ] =
233
- Iterator (elem1, elem2, elem3, elem4)
289
+ def iterator : Iterator [A ] = new SetNIterator [A ](size) {
290
+ def apply (i : Int ) = getElem(i)
291
+ }
292
+ private def getElem (i : Int ) = i match { case 0 => elem1 case 1 => elem2 case 2 => elem3 case 3 => elem4 }
293
+
234
294
override def foreach [U ](f : A => U ): Unit = {
235
295
f(elem1); f(elem2); f(elem3); f(elem4)
236
296
}
@@ -240,6 +300,23 @@ object Set extends ImmutableSetFactory[Set] {
240
300
override def forall (@ deprecatedName(' f ) p : A => Boolean ): Boolean = {
241
301
p(elem1) && p(elem2) && p(elem3) && p(elem4)
242
302
}
303
+ override private [scala] def filterImpl (pred : A => Boolean , isFlipped : Boolean ): Set [A ] = {
304
+ var r1, r2, r3 : A = null .asInstanceOf [A ]
305
+ var n = 0
306
+ if (pred(elem1) != isFlipped) { r1 = elem1; n += 1 }
307
+ if (pred(elem2) != isFlipped) { if (n == 0 ) r1 = elem2 else r2 = elem2; n += 1 }
308
+ if (pred(elem3) != isFlipped) { if (n == 0 ) r1 = elem3 else if (n == 1 ) r2 = elem3 else r3 = elem3; n += 1 }
309
+ if (pred(elem4) != isFlipped) { if (n == 0 ) r1 = elem4 else if (n == 1 ) r2 = elem4 else if (n == 2 ) r3 = elem4; n += 1 }
310
+
311
+ n match {
312
+ case 0 => Set .empty
313
+ case 1 => new Set1 (r1)
314
+ case 2 => new Set2 (r1, r2)
315
+ case 3 => new Set3 (r1, r2, r3)
316
+ case 4 => this
317
+ }
318
+ }
319
+
243
320
override def find (@ deprecatedName(' f ) p : A => Boolean ): Option [A ] = {
244
321
if (p(elem1)) Some (elem1)
245
322
else if (p(elem2)) Some (elem2)
0 commit comments