Skip to content

Commit a6d33ae

Browse files
committed
Add LongMap + friends to stdlib
1 parent d7eb59e commit a6d33ae

File tree

3 files changed

+789
-0
lines changed

3 files changed

+789
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Scala (https://www.scala-lang.org)
3+
*
4+
* Copyright EPFL and Lightbend, Inc.
5+
*
6+
* Licensed under Apache License 2.0
7+
* (http://www.apache.org/licenses/LICENSE-2.0).
8+
*
9+
* See the NOTICE file distributed with this work for
10+
* additional information regarding copyright ownership.
11+
*/
12+
13+
package scala
14+
package collection
15+
package mutable
16+
import language.experimental.captureChecking
17+
18+
19+
/**
20+
* Reusable builder for immutable collections
21+
*/
22+
abstract class ImmutableBuilder[-A, C <: IterableOnce[_]](empty: C)
23+
extends ReusableBuilder[A, C] {
24+
25+
protected var elems: C = empty
26+
27+
def clear(): Unit = { elems = empty }
28+
29+
def result(): C = elems
30+
31+
override def knownSize: Int = elems.knownSize
32+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Scala (https://www.scala-lang.org)
3+
*
4+
* Copyright EPFL and Lightbend, Inc.
5+
*
6+
* Licensed under Apache License 2.0
7+
* (http://www.apache.org/licenses/LICENSE-2.0).
8+
*
9+
* See the NOTICE file distributed with this work for
10+
* additional information regarding copyright ownership.
11+
*/
12+
13+
package scala.collection
14+
package mutable
15+
16+
import scala.annotation.tailrec
17+
import scala.collection.generic.DefaultSerializable
18+
import scala.collection.immutable.List
19+
import language.experimental.captureChecking
20+
21+
/** A simple mutable map backed by a list, so it preserves insertion order.
22+
*
23+
* @tparam K the type of the keys contained in this list map.
24+
* @tparam V the type of the values assigned to keys in this list map.
25+
*
26+
* @define Coll `mutable.ListMap`
27+
* @define coll mutable list map
28+
* @define mayNotTerminateInf
29+
* @define willNotTerminateInf
30+
* @define orderDependent
31+
* @define orderDependentFold
32+
*/
33+
@deprecated("Use an immutable.ListMap assigned to a var instead of mutable.ListMap", "2.13.0")
34+
class ListMap[sealed K, sealed V]
35+
extends AbstractMap[K, V]
36+
with MapOps[K, V, ListMap, ListMap[K, V]]
37+
with StrictOptimizedIterableOps[(K, V), Iterable, ListMap[K, V]]
38+
with StrictOptimizedMapOps[K, V, ListMap, ListMap[K, V]]
39+
with MapFactoryDefaults[K, V, ListMap, Iterable]
40+
with DefaultSerializable {
41+
42+
override def mapFactory: MapFactory[ListMap] = ListMap
43+
44+
private[this] var elems: List[(K, V)] = List()
45+
private[this] var siz: Int = 0
46+
47+
def get(key: K): Option[V] = elems find (_._1 == key) map (_._2)
48+
def iterator: Iterator[(K, V)] = elems.iterator
49+
50+
final override def addOne(kv: (K, V)) = {
51+
val (e, key0) = remove(kv._1, elems, List())
52+
elems = (key0, kv._2) :: e
53+
siz += 1; this
54+
}
55+
56+
final override def subtractOne(key: K) = { elems = remove(key, elems, List())._1; this }
57+
58+
@tailrec
59+
private def remove(key: K, elems: List[(K, V)], acc: List[(K, V)]): (List[(K, V)], K) = {
60+
if (elems.isEmpty) (acc, key)
61+
else if (elems.head._1 == key) { siz -= 1; (acc ::: elems.tail, elems.head._1) }
62+
else remove(key, elems.tail, elems.head :: acc)
63+
}
64+
65+
final override def clear(): Unit = { elems = List(); siz = 0 }
66+
67+
final override def size: Int = siz
68+
override def knownSize: Int = size
69+
override def isEmpty: Boolean = size == 0
70+
override protected[this] def stringPrefix = "ListMap"
71+
}
72+
73+
/** $factoryInfo
74+
* @define Coll `mutable.ListMap`
75+
* @define coll mutable list map
76+
*/
77+
@SerialVersionUID(3L)
78+
@deprecated("Use an immutable.ListMap assigned to a var instead of mutable.ListMap", "2.13.0")
79+
object ListMap extends MapFactory[ListMap] {
80+
def empty[sealed K, sealed V]: ListMap[K, V] = new ListMap[K, V]
81+
def from[sealed K, sealed V](it: IterableOnce[(K, V)]^): ListMap[K,V] = Growable.from(empty[K, V], it)
82+
def newBuilder[sealed K, sealed V]: Builder[(K, V), ListMap[K,V]] = new GrowableBuilder(empty[K, V])
83+
}

0 commit comments

Comments
 (0)