summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Gonçalves <ruippeixotog@gmail.com>2015-06-26 22:47:18 +0100
committerRui Gonçalves <ruippeixotog@gmail.com>2015-06-26 22:58:38 +0100
commit66bdc5200f5270f4064c6b92192a43db34136714 (patch)
tree95484a5058ac0ec81e2e1698edea07f54fd597e5
parentd90d8b89687be5c817cc081ed970328c6d8fd13f (diff)
downloadscala-66bdc5200f5270f4064c6b92192a43db34136714.tar.gz
scala-66bdc5200f5270f4064c6b92192a43db34136714.tar.bz2
scala-66bdc5200f5270f4064c6b92192a43db34136714.zip
Fix size update on `mutable.TreeMap#clear()`
The previous implementation has a major bug - although `clear()` sets the root node to `null`, the `size` attribute of the `Tree` was not updated. This effectively meant that even after a `map.clear()`, a call to `map.size` would still yield the old size of the map. The scalacheck test suite was updated to contemplate this issue.
-rw-r--r--src/library/scala/collection/mutable/RedBlackTree.scala2
-rw-r--r--src/library/scala/collection/mutable/TreeMap.scala4
-rw-r--r--test/files/scalacheck/MutableTreeMap.scala4
3 files changed, 6 insertions, 4 deletions
diff --git a/src/library/scala/collection/mutable/RedBlackTree.scala b/src/library/scala/collection/mutable/RedBlackTree.scala
index 7f12264d45..a3be011ae2 100644
--- a/src/library/scala/collection/mutable/RedBlackTree.scala
+++ b/src/library/scala/collection/mutable/RedBlackTree.scala
@@ -55,7 +55,9 @@ private[collection] object RedBlackTree {
// ---- size ----
def size(node: Node[_, _]): Int = if (node eq null) 0 else 1 + size(node.left) + size(node.right)
+ def size(tree: Tree[_, _]): Int = tree.size
def isEmpty(tree: Tree[_, _]) = tree.root eq null
+ def clear(tree: Tree[_, _]): Unit = { tree.root = null; tree.size = 0 }
// ---- search ----
diff --git a/src/library/scala/collection/mutable/TreeMap.scala b/src/library/scala/collection/mutable/TreeMap.scala
index 244cc18735..b96cef5bee 100644
--- a/src/library/scala/collection/mutable/TreeMap.scala
+++ b/src/library/scala/collection/mutable/TreeMap.scala
@@ -64,7 +64,7 @@ sealed class TreeMap[A, B] private (tree: RB.Tree[A, B])(implicit val ordering:
def keysIteratorFrom(start: A) = RB.keysIterator(tree, Some(start))
def valuesIteratorFrom(start: A) = RB.valuesIterator(tree, Some(start))
- override def size = tree.size
+ override def size = RB.size(tree)
override def isEmpty = RB.isEmpty(tree)
override def contains(key: A) = RB.contains(tree, key)
@@ -78,7 +78,7 @@ sealed class TreeMap[A, B] private (tree: RB.Tree[A, B])(implicit val ordering:
override def foreach[U](f: ((A, B)) => U): Unit = RB.foreach(tree, f)
override def transform(f: (A, B) => B) = { RB.transform(tree, f); this }
- override def clear(): Unit = tree.root = null
+ override def clear(): Unit = RB.clear(tree)
override def stringPrefix = "TreeMap"
diff --git a/test/files/scalacheck/MutableTreeMap.scala b/test/files/scalacheck/MutableTreeMap.scala
index ac073b1c42..b072307a63 100644
--- a/test/files/scalacheck/MutableTreeMap.scala
+++ b/test/files/scalacheck/MutableTreeMap.scala
@@ -163,7 +163,7 @@ package scala.collection.mutable {
property("clear") = forAll { (map: mutable.TreeMap[K, V]) =>
map.clear()
- map.isEmpty
+ map.isEmpty && map.size == 0
}
property("serializable") = forAll { (map: mutable.TreeMap[K, V]) =>
@@ -303,7 +303,7 @@ package scala.collection.mutable {
property("clear") = forAll { (map: mutable.TreeMap[K, V], from: Option[K], until: Option[K]) =>
val mapView = map.rangeImpl(from, until)
mapView.clear()
- map.isEmpty && mapView.isEmpty
+ map.isEmpty && mapView.isEmpty && map.size == 0 && mapView.size == 0
}
property("serializable") = forAll { (map: mutable.TreeMap[K, V], from: Option[K], until: Option[K]) =>