diff options
author | Martin Odersky <odersky@gmail.com> | 2013-06-22 07:17:31 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-06-22 07:17:31 +0200 |
commit | 691d265854f79e2a8fb26d58963c8c57d3caf499 (patch) | |
tree | 743d10f43ee2d10c3bf7b5cfe6a967e8dbbab7f7 /src/dotty/tools/dotc/util | |
parent | 55503475f78d9e8bd90468d0efc01f8efae94cea (diff) | |
download | dotty-691d265854f79e2a8fb26d58963c8c57d3caf499.tar.gz dotty-691d265854f79e2a8fb26d58963c8c57d3caf499.tar.bz2 dotty-691d265854f79e2a8fb26d58963c8c57d3caf499.zip |
Flehsed out constraints, with more efficient maps.
Diffstat (limited to 'src/dotty/tools/dotc/util')
-rw-r--r-- | src/dotty/tools/dotc/util/SimpleMap.scala | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/util/SimpleMap.scala b/src/dotty/tools/dotc/util/SimpleMap.scala new file mode 100644 index 000000000..f54ae8022 --- /dev/null +++ b/src/dotty/tools/dotc/util/SimpleMap.scala @@ -0,0 +1,125 @@ +package dotty.tools.dotc.util + +abstract class SimpleMap[-K, +V >: Null] { + def apply(k: K): V + def remove(k: K): SimpleMap[K, V] + def updated[V1 >: V](k: K, v: V1): SimpleMap[K, V1] + def contains(k: K): Boolean = apply(k) != null +} + +object SimpleMap { + + object Empty extends SimpleMap[Any, Null] { + def apply(k: Any) = null + def remove(k: Any) = this + def updated[V1 >: Null](k: Any, v: V1) = new Map1(k, v) + } + + class Map1[-K, +V >: Null] (k1: K, v1: V) extends SimpleMap[K, V] { + def apply(k: K) = + if (k == k1) v1 + else null + def remove(k: K) = + if (k == k1) Empty + else this + def updated[V1 >: V](k: K, v: V1) = + if (k == k1) new Map1(k, v) + else new Map2(k1, v1, k, v) + } + + class Map2[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V) extends SimpleMap[K, V] { + def apply(k: K) = + if (k == k1) v1 + else if (k == k2) v2 + else null + def remove(k: K) = + if (k == k1) new Map1(k2, v2) + else if (k == k2) new Map1(k1, v1) + else this + def updated[V1 >: V](k: K, v: V1) = + if (k == k1) new Map2(k, v, k2, v2) + else if (k == k2) new Map2(k1, v1, k, v) + else new Map3(k1, v1, k2, v2, k, v) + } + + class Map3[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V) extends SimpleMap[K, V] { + def apply(k: K) = + if (k == k1) v1 + else if (k == k2) v2 + else if (k == k3) v3 + else null + def remove(k: K) = + if (k == k1) new Map2(k2, v2, k3, v3) + else if (k == k2) new Map2(k1, v1, k3, v3) + else if (k == k3) new Map2(k1, v1, k2, v2) + else this + def updated[V1 >: V](k: K, v: V1) = + if (k == k1) new Map3(k, v, k2, v2, k3, v3) + else if (k == k2) new Map3(k1, v1, k, v, k3, v3) + else if (k == k3) new Map3(k1, v1, k2, v2, k, v) + else new Map4(k1, v1, k2, v2, k3, v3, k, v) + } + + class Map4[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V) extends SimpleMap[K, V] { + def apply(k: K) = + if (k == k1) v1 + else if (k == k2) v2 + else if (k == k3) v3 + else if (k == k4) v4 + else null + def remove(k: K) = + if (k == k1) new Map3(k2, v2, k3, v3, k4, v4) + else if (k == k2) new Map3(k1, v1, k3, v3, k4, v4) + else if (k == k3) new Map3(k1, v1, k2, v2, k4, v4) + else if (k == k4) new Map3(k1, v1, k2, v2, k3, v3) + else this + def updated[V1 >: V](k: K, v: V1) = + if (k == k1) new Map4(k, v, k2, v2, k3, v3, k4, v4) + else if (k == k2) new Map4(k1, v1, k, v, k3, v3, k4, v4) + else if (k == k3) new Map4(k1, v1, k2, v2, k, v, k4, v4) + else if (k == k4) new Map4(k1, v1, k2, v2, k3, v3, k, v) + else new Map5(k1, v1, k2, v2, k3, v3, k4, v4, k, v) + } + + class Map5[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V, k5: K, v5: V) extends SimpleMap[K, V] { + def apply(k: K) = + if (k == k1) v1 + else if (k == k2) v2 + else if (k == k3) v3 + else if (k == k4) v4 + else if (k == k5) v5 + else null + def remove(k: K) = + if (k == k1) new Map4(k2, v2, k3, v3, k4, v4, k5, v5) + else if (k == k2) new Map4(k1, v1, k3, v3, k4, v4, k5, v5) + else if (k == k3) new Map4(k1, v1, k2, v2, k4, v4, k5, v5) + else if (k == k4) new Map4(k1, v1, k2, v2, k3, v3, k5, v5) + else if (k == k5) new Map4(k1, v1, k2, v2, k3, v3, k4, v4) + else this + def updated[V1 >: V](k: K, v: V1) = + if (k == k1) new Map5(k, v, k2, v2, k3, v3, k4, v4, k5, v5) + else if (k == k2) new Map5(k1, v1, k, v, k3, v3, k4, v4, k5, v5) + else if (k == k3) new Map5(k1, v1, k2, v2, k, v, k4, v4, k5, v5) + else if (k == k4) new Map5(k1, v1, k2, v2, k3, v3, k, v, k5, v5) + else if (k == k5) new Map5(k1, v1, k2, v2, k3, v3, k4, v4, k, v) + else new MapMore(Map(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4, k5 -> v5, k -> v)) + } + + class MapMore[-K, +V >: Null] (m: Map[K, V]) extends SimpleMap[K, V] { + def apply(k: K) = m get k match { + case Some(v) => v + case None => null + } + def remove(k: K) = { + val m1 = m - k + if (m1.size > 5) new MapMore(m1) + else { + val List((k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5)) = m1.toList + new Map5(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5) + } + } + def updated[V1 >: V](k: K, v: V1) = + new MapMore(m.updated(k, v)) + override def contains(k: K) = m contains k + } +} |