Created
March 19, 2018 17:11
-
-
Save szeiger/81fed5b31a70415ed7e8a82182f2df94 to your computer and use it in GitHub Desktop.
git blame src/library/scala/collection/immutable/LongMap.scala
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 1) /* __ *\ | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 2) ** ________ ___ / / ___ Scala API ** | |
807dbe557a4 src/library/scala/collection/immutable/LongMap.scala (Heather Miller 2012-11-02 18:12:57 +0100 3) ** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL ** | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 4) ** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 5) ** /____/\___/_/ |_/____/_/ | | ** | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 6) ** |/ ** | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 7) \* */ | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 8) | |
5f04201eab6 src/library/scala/collection/immutable/LongMap.scala (Stefan Zeiger 2018-03-19 17:37:44 +0100 9) package scala.collection | |
4a727f3b01d src/library/scala/collection/immutable/LongMap.scala (Martin Odersky 2009-09-25 16:20:13 +0000 10) package immutable | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 11) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 12) import java.lang.IllegalStateException | |
5f04201eab6 src/library/scala/collection/immutable/LongMap.scala (Stefan Zeiger 2018-03-19 17:37:44 +0100 13) import scala.collection.generic.BitOperations | |
5f04201eab6 src/library/scala/collection/immutable/LongMap.scala (Stefan Zeiger 2018-03-19 17:37:44 +0100 14) import scala.collection.mutable.{Builder, ImmutableBuilder, ListBuffer} | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 15) import scala.annotation.tailrec | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 16) import scala.annotation.tailrec | |
0394b8426ff src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-07-09 11:31:34 +0000 17) | |
628b2edf736 src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-04-13 10:29:58 +0000 18) /** Utility class for long maps. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 19) * @author David MacIver | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 20) */ | |
4af620886bd src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2011-01-10 21:09:43 +0000 21) private[immutable] object LongMapUtils extends BitOperations.Long { | |
4af620886bd src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2011-01-10 21:09:43 +0000 22) def branchMask(i: Long, j: Long) = highestOneBit(i ^ j) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 23) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 24) def join[T](p1: Long, t1: LongMap[T], p2: Long, t2: LongMap[T]): LongMap[T] = { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 25) val m = branchMask(p1, p2) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 26) val p = mask(p1, m) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 27) if (zero(p1, m)) LongMap.Bin(p, m, t1, t2) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 28) else LongMap.Bin(p, m, t2, t1) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 29) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 30) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 31) def bin[T](prefix: Long, mask: Long, left: LongMap[T], right: LongMap[T]): LongMap[T] = (left, right) match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 32) case (left, LongMap.Nil) => left | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 33) case (LongMap.Nil, right) => right | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 34) case (left, right) => LongMap.Bin(prefix, mask, left, right) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 35) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 36) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 37) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 38) import LongMapUtils._ | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 39) | |
628b2edf736 src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-04-13 10:29:58 +0000 40) /** A companion object for long maps. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 41) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 42) * @define Coll `LongMap` | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 43) * @since 2.7 | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 44) */ | |
96965c4459c src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2011-03-30 21:00:08 +0000 45) object LongMap { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 46) def empty[T]: LongMap[T] = LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 47) def singleton[T](key: Long, value: T): LongMap[T] = LongMap.Tip(key, value) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 48) def apply[T](elems: (Long, T)*): LongMap[T] = | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 49) elems.foldLeft(empty[T])((x, y) => x.updated(y._1, y._2)) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 50) | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 51) def from[V](coll: IterableOnce[(Long, V)]): LongMap[V] = | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 52) newBuilder[V]().addAll(coll).result() | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 53) | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 54) def newBuilder[V](): Builder[(Long, V), LongMap[V]] = | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 55) new ImmutableBuilder[(Long, V), LongMap[V]](empty) { | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 56) def addOne(elem: (Long, V)): this.type = { elems = elems + elem; this } | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 57) } | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 58) | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 59) @SerialVersionUID(3L) | |
d4716791267 src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2009-09-09 03:19:07 +0000 60) private[immutable] case object Nil extends LongMap[Nothing] { | |
d4716791267 src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2009-09-09 03:19:07 +0000 61) // Important, don't remove this! See IntMap for explanation. | |
06e3400b2cd src/library/scala/collection/immutable/LongMap.scala (David MacIver 2009-03-26 20:08:56 +0000 62) override def equals(that : Any) = that match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 63) case (that: AnyRef) if (this eq that) => true | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 64) case (that: LongMap[_]) => false // The only empty LongMaps are eq Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 65) case that => super.equals(that) | |
06e3400b2cd src/library/scala/collection/immutable/LongMap.scala (David MacIver 2009-03-26 20:08:56 +0000 66) } | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 67) } | |
06e3400b2cd src/library/scala/collection/immutable/LongMap.scala (David MacIver 2009-03-26 20:08:56 +0000 68) | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 69) @SerialVersionUID(3L) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 70) private[immutable] case class Tip[+T](key: Long, value: T) extends LongMap[T] { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 71) def withValue[S](s: S) = | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 72) if (s.asInstanceOf[AnyRef] eq value.asInstanceOf[AnyRef]) this.asInstanceOf[LongMap.Tip[S]] | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 73) else LongMap.Tip(key, s) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 74) } | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 75) | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 76) @SerialVersionUID(3L) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 77) private[immutable] case class Bin[+T](prefix: Long, mask: Long, left: LongMap[T], right: LongMap[T]) extends LongMap[T] { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 78) def bin[S](left: LongMap[S], right: LongMap[S]): LongMap[S] = { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 79) if ((this.left eq left) && (this.right eq right)) this.asInstanceOf[LongMap.Bin[S]] | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 80) else LongMap.Bin[S](prefix, mask, left, right) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 81) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 82) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 83) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 84) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 85) // Iterator over a non-empty LongMap. | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 86) private[immutable] abstract class LongMapIterator[V, T](it: LongMap[V]) extends AbstractIterator[T] { | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 87) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 88) // Basically this uses a simple stack to emulate conversion over the tree. However | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 89) // because we know that Longs are only 64 bits we can have at most 64 LongMap.Bins and | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 90) // one LongMap.Tip sitting on the tree at any point. Therefore we know the maximum stack | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 91) // depth is 65 | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 92) var index = 0 | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 93) var buffer = new Array[AnyRef](65) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 94) | |
13c59adf9fb src/library/scala/collection/immutable/LongMap.scala (Martin Odersky 2011-03-14 11:43:13 +0000 95) def pop() = { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 96) index -= 1 | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 97) buffer(index).asInstanceOf[LongMap[V]] | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 98) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 99) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 100) def push(x: LongMap[V]): Unit = { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 101) buffer(index) = x.asInstanceOf[AnyRef] | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 102) index += 1 | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 103) } | |
8cdf3b3f51a src/library/scala/collection/immutable/LongMap.scala (Jason Zaugg 2013-02-24 23:00:47 +0100 104) push(it) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 105) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 106) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 107) * What value do we assign to a tip? | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 108) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 109) def valueOf(tip: LongMap.Tip[V]): T | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 110) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 111) def hasNext = index != 0 | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 112) final def next(): T = | |
13c59adf9fb src/library/scala/collection/immutable/LongMap.scala (Martin Odersky 2011-03-14 11:43:13 +0000 113) pop() match { | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 114) case LongMap.Bin(_,_, [email protected](_, _), right) => { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 115) push(right) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 116) valueOf(t) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 117) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 118) case LongMap.Bin(_, _, left, right) => { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 119) push(right) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 120) push(left) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 121) next() | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 122) } | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 123) case [email protected](_, _) => valueOf(t) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 124) // This should never happen. We don't allow LongMap.Nil in subtrees of the LongMap | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 125) // and don't return an LongMapIterator for LongMap.Nil. | |
2cf52fde2a8 src/library/scala/collection/immutable/LongMap.scala (Adriaan Moors 2017-02-06 16:01:37 -0800 126) case LongMap.Nil => throw new IllegalStateException("Empty maps not allowed as subtrees") | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 127) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 128) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 129) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 130) private[immutable] class LongMapEntryIterator[V](it: LongMap[V]) extends LongMapIterator[V, (Long, V)](it){ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 131) def valueOf(tip: LongMap.Tip[V]) = (tip.key, tip.value) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 132) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 133) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 134) private[immutable] class LongMapValueIterator[V](it: LongMap[V]) extends LongMapIterator[V, V](it){ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 135) def valueOf(tip: LongMap.Tip[V]) = tip.value | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 136) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 137) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 138) private[immutable] class LongMapKeyIterator[V](it: LongMap[V]) extends LongMapIterator[V, Long](it){ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 139) def valueOf(tip: LongMap.Tip[V]) = tip.key | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 140) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 141) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 142) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 143) * Specialised immutable map structure for long keys, based on | |
a9ff9c0f5c6 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-03-06 18:17:44 +0100 144) * [[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.37.5452 Fast Mergeable Long Maps]] | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 145) * by Okasaki and Gill. Essentially a trie based on binary digits of the integers. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 146) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 147) * Note: This class is as of 2.8 largely superseded by HashMap. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 148) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 149) * @tparam T type of the values associated with the long keys. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 150) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 151) * @since 2.7 | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 152) * @define Coll `immutable.LongMap` | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 153) * @define coll immutable long integer map | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 154) * @define mayNotTerminateInf | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 155) * @define willNotTerminateInf | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 156) */ | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 157) @SerialVersionUID(3L) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 158) sealed abstract class LongMap[+T] extends Map[Long, T] | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 159) with MapOps[Long, T, Map, LongMap[T]] | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 160) with StrictOptimizedIterableOps[(Long, T), Iterable, LongMap[T]] | |
e12d2a46f2b collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Marcelo Cenerino 2018-02-09 17:26:22 +0000 161) with Serializable { | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 162) | |
5f04201eab6 src/library/scala/collection/immutable/LongMap.scala (Stefan Zeiger 2018-03-19 17:37:44 +0100 163) override protected[this] def fromSpecificIterable(coll: scala.collection.Iterable[(Long, T)]): LongMap[T] = { | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 164) //TODO should this be the default implementation of this method in StrictOptimizedIterableOps? | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 165) val b = newSpecificBuilder() | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 166) b.sizeHint(coll) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 167) b.addAll(coll) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 168) b.result() | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 169) } | |
ba9e48a93f9 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2018-02-18 17:20:02 +0100 170) override protected[this] def newSpecificBuilder(): Builder[(Long, T), LongMap[T]] = | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 171) new ImmutableBuilder[(Long, T), LongMap[T]](empty) { | |
63944c6e54d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2018-01-11 20:24:14 +0100 172) def addOne(elem: (Long, T)): this.type = { elems = elems + elem; this } | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 173) } | |
a0a045f5c0b src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2011-11-07 18:22:42 +0000 174) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 175) override def empty: LongMap[T] = LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 176) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 177) override def toList = { | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 178) val buffer = new ListBuffer[(Long, T)] | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 179) foreach(buffer += _) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 180) buffer.toList | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 181) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 182) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 183) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 184) * Iterator over key, value pairs of the map in unsigned order of the keys. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 185) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 186) * @return an iterator over pairs of long keys and corresponding values. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 187) */ | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 188) def iterator(): Iterator[(Long, T)] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 189) case LongMap.Nil => Iterator.empty | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 190) case _ => new LongMapEntryIterator(this) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 191) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 192) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 193) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 194) * Loops over the key, value pairs of the map in unsigned order of the keys. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 195) */ | |
6ed70100455 src/library/scala/collection/immutable/LongMap.scala (vsalvis 2015-06-29 18:56:06 +0200 196) override final def foreach[U](f: ((Long, T)) => U): Unit = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 197) case LongMap.Bin(_, _, left, right) => { left.foreach(f); right.foreach(f) } | |
8cdf3b3f51a src/library/scala/collection/immutable/LongMap.scala (Jason Zaugg 2013-02-24 23:00:47 +0100 198) case LongMap.Tip(key, value) => f((key, value)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 199) case LongMap.Nil => | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 200) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 201) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 202) override def keysIterator(): Iterator[Long] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 203) case LongMap.Nil => Iterator.empty | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 204) case _ => new LongMapKeyIterator(this) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 205) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 206) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 207) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 208) * Loop over the keys of the map. The same as keys.foreach(f), but may | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 209) * be more efficient. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 210) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 211) * @param f The loop body | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 212) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 213) final def foreachKey(f: Long => Unit): Unit = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 214) case LongMap.Bin(_, _, left, right) => { left.foreachKey(f); right.foreachKey(f) } | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 215) case LongMap.Tip(key, _) => f(key) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 216) case LongMap.Nil => | |
11663541b4d src/library/scala/collection/immutable/LongMap.scala (Aleksandar Prokopec 2010-04-13 11:41:54 +0000 217) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 218) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 219) override def valuesIterator(): Iterator[T] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 220) case LongMap.Nil => Iterator.empty | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 221) case _ => new LongMapValueIterator(this) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 222) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 223) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 224) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 225) * Loop over the values of the map. The same as values.foreach(f), but may | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 226) * be more efficient. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 227) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 228) * @param f The loop body | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 229) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 230) final def foreachValue(f: T => Unit): Unit = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 231) case LongMap.Bin(_, _, left, right) => { left.foreachValue(f); right.foreachValue(f) } | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 232) case LongMap.Tip(_, value) => f(value) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 233) case LongMap.Nil => | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 234) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 235) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 236) override def className = "LongMap" | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 237) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 238) override def isEmpty = this == LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 239) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 240) override def filter(f: ((Long, T)) => Boolean): LongMap[T] = this match { | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 241) case LongMap.Bin(prefix, mask, left, right) => { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 242) val (newleft, newright) = (left.filter(f), right.filter(f)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 243) if ((left eq newleft) && (right eq newright)) this | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 244) else bin(prefix, mask, newleft, newright) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 245) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 246) case LongMap.Tip(key, value) => | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 247) if (f((key, value))) this | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 248) else LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 249) case LongMap.Nil => LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 250) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 251) | |
ae651c10235 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-01-22 09:52:21 +0100 252) override def transform[S](f: (Long, T) => S): LongMap[S] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 253) case [email protected](prefix, mask, left, right) => b.bin(left.transform(f), right.transform(f)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 254) case [email protected](key, value) => t.withValue(f(key, value)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 255) case LongMap.Nil => LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 256) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 257) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 258) final override def size: Int = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 259) case LongMap.Nil => 0 | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 260) case LongMap.Tip(_, _) => 1 | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 261) case LongMap.Bin(_, _, left, right) => left.size + right.size | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 262) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 263) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 264) final def get(key: Long): Option[T] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 265) case LongMap.Bin(prefix, mask, left, right) => if (zero(key, mask)) left.get(key) else right.get(key) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 266) case LongMap.Tip(key2, value) => if (key == key2) Some(value) else None | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 267) case LongMap.Nil => None | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 268) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 269) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 270) final override def getOrElse[S >: T](key: Long, default: => S): S = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 271) case LongMap.Nil => default | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 272) case LongMap.Tip(key2, value) => if (key == key2) value else default | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 273) case LongMap.Bin(prefix, mask, left, right) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 274) if (zero(key, mask)) left.getOrElse(key, default) else right.getOrElse(key, default) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 275) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 276) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 277) final override def apply(key: Long): T = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 278) case LongMap.Bin(prefix, mask, left, right) => if (zero(key, mask)) left(key) else right(key) | |
2cf52fde2a8 src/library/scala/collection/immutable/LongMap.scala (Adriaan Moors 2017-02-06 16:01:37 -0800 279) case LongMap.Tip(key2, value) => if (key == key2) value else throw new IllegalArgumentException("Key not found") | |
2cf52fde2a8 src/library/scala/collection/immutable/LongMap.scala (Adriaan Moors 2017-02-06 16:01:37 -0800 280) case LongMap.Nil => throw new IllegalArgumentException("key not found") | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 281) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 282) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 283) override def + [S >: T] (kv: (Long, S)): LongMap[S] = updated(kv._1, kv._2) | |
39fdbddb881 src/library/scala/collection/immutable/LongMap.scala (Martin Odersky 2009-05-12 18:33:22 +0000 284) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 285) override def updated[S >: T](key: Long, value: S): LongMap[S] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 286) case LongMap.Bin(prefix, mask, left, right) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 287) if (!hasMatch(key, prefix, mask)) join(key, LongMap.Tip(key, value), prefix, this) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 288) else if (zero(key, mask)) LongMap.Bin(prefix, mask, left.updated(key, value), right) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 289) else LongMap.Bin(prefix, mask, left, right.updated(key, value)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 290) case LongMap.Tip(key2, value2) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 291) if (key == key2) LongMap.Tip(key, value) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 292) else join(key, LongMap.Tip(key, value), key2, this) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 293) case LongMap.Nil => LongMap.Tip(key, value) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 294) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 295) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 296) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 297) * Updates the map, using the provided function to resolve conflicts if the key is already present. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 298) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 299) * Equivalent to | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 300) * {{{ | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 301) * this.get(key) match { | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 302) * case None => this.update(key, value) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 303) * case Some(oldvalue) => this.update(key, f(oldvalue, value) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 304) * } | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 305) * }}} | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 306) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 307) * @tparam S The supertype of values in this `LongMap`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 308) * @param key The key to update. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 309) * @param value The value to use if there is no conflict. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 310) * @param f The function used to resolve conflicts. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 311) * @return The updated map. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 312) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 313) def updateWith[S >: T](key: Long, value: S, f: (T, S) => S): LongMap[S] = this match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 314) case LongMap.Bin(prefix, mask, left, right) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 315) if (!hasMatch(key, prefix, mask)) join(key, LongMap.Tip(key, value), prefix, this) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 316) else if (zero(key, mask)) LongMap.Bin(prefix, mask, left.updateWith(key, value, f), right) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 317) else LongMap.Bin(prefix, mask, left, right.updateWith(key, value, f)) | |
ea0d891f238 src/library/scala/collection/immutable/LongMap.scala (Paul Phillips 2012-09-15 14:09:46 -0700 318) case LongMap.Tip(key2, value2) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 319) if (key == key2) LongMap.Tip(key, f(value2, value)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 320) else join(key, LongMap.Tip(key, value), key2, this) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 321) case LongMap.Nil => LongMap.Tip(key, value) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 322) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 323) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 324) def remove(key: Long): LongMap[T] = this match { | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 325) case LongMap.Bin(prefix, mask, left, right) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 326) if (!hasMatch(key, prefix, mask)) this | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 327) else if (zero(key, mask)) bin(prefix, mask, left - key, right) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 328) else bin(prefix, mask, left, right - key) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 329) case LongMap.Tip(key2, _) => | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 330) if (key == key2) LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 331) else this | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 332) case LongMap.Nil => LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 333) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 334) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 335) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 336) * A combined transform and filter function. Returns an `LongMap` such that | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 337) * for each `(key, value)` mapping in this map, if `f(key, value) == None` | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 338) * the map contains no mapping for key, and if `f(key, value)`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 339) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 340) * @tparam S The type of the values in the resulting `LongMap`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 341) * @param f The transforming function. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 342) * @return The modified map. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 343) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 344) def modifyOrRemove[S](f: (Long, T) => Option[S]): LongMap[S] = this match { | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 345) case LongMap.Bin(prefix, mask, left, right) => { | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 346) val newleft = left.modifyOrRemove(f) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 347) val newright = right.modifyOrRemove(f) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 348) if ((left eq newleft) && (right eq newright)) this.asInstanceOf[LongMap[S]] | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 349) else bin(prefix, mask, newleft, newright) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 350) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 351) case LongMap.Tip(key, value) => f(key, value) match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 352) case None => LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 353) case Some(value2) => | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 354) //hack to preserve sharing | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 355) if (value.asInstanceOf[AnyRef] eq value2.asInstanceOf[AnyRef]) this.asInstanceOf[LongMap[S]] | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 356) else LongMap.Tip(key, value2) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 357) } | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 358) case LongMap.Nil => LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 359) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 360) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 361) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 362) * Forms a union map with that map, using the combining function to resolve conflicts. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 363) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 364) * @tparam S The type of values in `that`, a supertype of values in `this`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 365) * @param that The map to form a union with. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 366) * @param f The function used to resolve conflicts between two mappings. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 367) * @return Union of `this` and `that`, with identical key conflicts resolved using the function `f`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 368) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 369) def unionWith[S >: T](that: LongMap[S], f: (Long, S, S) => S): LongMap[S] = (this, that) match{ | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 370) case (LongMap.Bin(p1, m1, l1, r1), that@(LongMap.Bin(p2, m2, l2, r2))) => | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 371) if (shorter(m1, m2)) { | |
9acab45aeea src/library/scala/collection/immutable/LongMap.scala (Lukas Rytz 2017-04-24 23:18:18 +0200 372) if (!hasMatch(p2, p1, m1)) join[S](p1, this, p2, that) // TODO: remove [S] when scala/bug#5548 is fixed | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 373) else if (zero(p2, m1)) LongMap.Bin(p1, m1, l1.unionWith(that, f), r1) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 374) else LongMap.Bin(p1, m1, l1, r1.unionWith(that, f)) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 375) } else if (shorter(m2, m1)){ | |
9acab45aeea src/library/scala/collection/immutable/LongMap.scala (Lukas Rytz 2017-04-24 23:18:18 +0200 376) if (!hasMatch(p1, p2, m2)) join[S](p1, this, p2, that) // TODO: remove [S] when scala/bug#5548 is fixed | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 377) else if (zero(p1, m2)) LongMap.Bin(p2, m2, this.unionWith(l2, f), r2) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 378) else LongMap.Bin(p2, m2, l2, this.unionWith(r2, f)) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 379) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 380) else { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 381) if (p1 == p2) LongMap.Bin(p1, m1, l1.unionWith(l2,f), r1.unionWith(r2, f)) | |
9acab45aeea src/library/scala/collection/immutable/LongMap.scala (Lukas Rytz 2017-04-24 23:18:18 +0200 382) else join[S](p1, this, p2, that) // TODO: remove [S] when scala/bug#5548 is fixed | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 383) } | |
9acab45aeea src/library/scala/collection/immutable/LongMap.scala (Lukas Rytz 2017-04-24 23:18:18 +0200 384) case (LongMap.Tip(key, value), x) => x.updateWith[S](key, value, (x, y) => f(key, y, x)) // TODO: remove [S] when scala/bug#5548 is fixed | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 385) case (x, LongMap.Tip(key, value)) => x.updateWith[S](key, value, (x, y) => f(key, x, y)) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 386) case (LongMap.Nil, x) => x | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 387) case (x, LongMap.Nil) => x | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 388) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 389) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 390) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 391) * Forms the intersection of these two maps with a combining function. The | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 392) * resulting map is a map that has only keys present in both maps and has | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 393) * values produced from the original mappings by combining them with `f`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 394) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 395) * @tparam S The type of values in `that`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 396) * @tparam R The type of values in the resulting `LongMap`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 397) * @param that The map to intersect with. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 398) * @param f The combining function. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 399) * @return Intersection of `this` and `that`, with values for identical keys produced by function `f`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 400) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 401) def intersectionWith[S, R](that: LongMap[S], f: (Long, T, S) => R): LongMap[R] = (this, that) match { | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 402) case (LongMap.Bin(p1, m1, l1, r1), [email protected](p2, m2, l2, r2)) => | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 403) if (shorter(m1, m2)) { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 404) if (!hasMatch(p2, p1, m1)) LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 405) else if (zero(p2, m1)) l1.intersectionWith(that, f) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 406) else r1.intersectionWith(that, f) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 407) } else if (m1 == m2) bin(p1, m1, l1.intersectionWith(l2, f), r1.intersectionWith(r2, f)) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 408) else { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 409) if (!hasMatch(p1, p2, m2)) LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 410) else if (zero(p1, m2)) this.intersectionWith(l2, f) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 411) else this.intersectionWith(r2, f) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 412) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 413) case (LongMap.Tip(key, value), that) => that.get(key) match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 414) case None => LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 415) case Some(value2) => LongMap.Tip(key, f(key, value, value2)) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 416) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 417) case (_, LongMap.Tip(key, value)) => this.get(key) match { | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 418) case None => LongMap.Nil | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 419) case Some(value2) => LongMap.Tip(key, f(key, value2, value)) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 420) } | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 421) case (_, _) => LongMap.Nil | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 422) } | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 423) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 424) /** | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 425) * Left biased intersection. Returns the map that has all the same mappings as this but only for keys | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 426) * which are present in the other map. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 427) * | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 428) * @tparam R The type of values in `that`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 429) * @param that The map to intersect with. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 430) * @return A map with all the keys both in `this` and `that`, mapped to corresponding values from `this`. | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 431) */ | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 432) def intersection[R](that: LongMap[R]): LongMap[T] = | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 433) this.intersectionWith(that, (key: Long, value: T, value2: R) => value) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 434) | |
f02e19ea98d src/library/scala/collection/immutable/LongMap.scala (Simon Ochsenreither 2012-06-24 04:29:47 +0300 435) def ++[S >: T](that: LongMap[S]) = | |
14a631a5fec src/library/scala/collection/immutable/LongMap.scala (Martin Odersky 2009-05-08 16:33:15 +0000 436) this.unionWith[S](that, (key, x, y) => y) | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 437) | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 438) @tailrec | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 439) final def firstKey: Long = this match { | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 440) case LongMap.Bin(_, _, l, r) => l.firstKey | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 441) case LongMap.Tip(k, v) => k | |
2cf52fde2a8 src/library/scala/collection/immutable/LongMap.scala (Adriaan Moors 2017-02-06 16:01:37 -0800 442) case LongMap.Nil => throw new IllegalStateException("Empty set") | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 443) } | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 444) | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 445) @tailrec | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 446) final def lastKey: Long = this match { | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 447) case LongMap.Bin(_, _, l, r) => r.lastKey | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 448) case LongMap.Tip(k , v) => k | |
2cf52fde2a8 src/library/scala/collection/immutable/LongMap.scala (Adriaan Moors 2017-02-06 16:01:37 -0800 449) case LongMap.Nil => throw new IllegalStateException("Empty set") | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 450) } | |
8bd03e063c4 src/library/scala/collection/immutable/LongMap.scala (Michael Thorpe 2013-01-31 21:06:02 +0000 451) | |
7a1e4e7b326 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-02-08 16:02:03 +0100 452) def map[V2](f: ((Long, T)) => (Long, V2)): LongMap[V2] = LongMap.from(new View.Map(coll, f)) | |
6e159702e1e src/library/scala/collection/immutable/LongMap.scala (Geoffrey Washburn 2008-08-05 09:44:36 +0000 453) | |
7a1e4e7b326 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-02-08 16:02:03 +0100 454) def flatMap[V2](f: ((Long, T)) => IterableOnce[(Long, V2)]): LongMap[V2] = LongMap.from(new View.FlatMap(coll, f)) | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 455) | |
5f04201eab6 src/library/scala/collection/immutable/LongMap.scala (Stefan Zeiger 2018-03-19 17:37:44 +0100 456) override def concat[V1 >: T](that: scala.collection.Iterable[(Long, V1)]): LongMap[V1] = | |
c90485e2083 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 457) super.concat(that).asInstanceOf[LongMap[V1]] // Already has corect type but not declared as such | |
f119a7ac745 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-03-08 15:15:09 +0100 458) | |
5f04201eab6 src/library/scala/collection/immutable/LongMap.scala (Stefan Zeiger 2018-03-19 17:37:44 +0100 459) override def ++ [V1 >: T](that: scala.collection.Iterable[(Long, V1)]): LongMap[V1] = concat(that) | |
f119a7ac745 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-03-08 15:15:09 +0100 460) | |
f119a7ac745 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-03-08 15:15:09 +0100 461) def collect[V2](pf: PartialFunction[(Long, T), (Long, V2)]): LongMap[V2] = | |
f119a7ac745 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-03-08 15:15:09 +0100 462) flatMap(kv => if (pf.isDefinedAt(kv)) new View.Single(pf(kv)) else View.Empty) | |
f119a7ac745 collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Julien Richard-Foy 2018-03-08 15:15:09 +0100 463) | |
22728c8290d collection-strawman/collections/src/main/scala/strawman/collection/immutable/LongMap.scala (Stefan Zeiger 2017-08-29 17:01:52 +0200 464) } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment