Skip to content

Instantly share code, notes, and snippets.

@szeiger
Created March 19, 2018 17:11
Show Gist options
  • Save szeiger/81fed5b31a70415ed7e8a82182f2df94 to your computer and use it in GitHub Desktop.
Save szeiger/81fed5b31a70415ed7e8a82182f2df94 to your computer and use it in GitHub Desktop.
git blame src/library/scala/collection/immutable/LongMap.scala
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