diff options
author | Josh Suereth <joshua.suereth@gmail.com> | 2012-09-10 16:13:51 -0400 |
---|---|---|
committer | Josh Suereth <joshua.suereth@gmail.com> | 2012-09-14 09:53:02 -0400 |
commit | f3fd018f145ffc02de03744259ba585d8152483f (patch) | |
tree | 6d7f80d910542cb50daceb1e3b52ea3145409d3d /src | |
parent | 76d4e9a8071f9e102106696664376b7f70622582 (diff) | |
download | scala-f3fd018f145ffc02de03744259ba585d8152483f.tar.gz scala-f3fd018f145ffc02de03744259ba585d8152483f.tar.bz2 scala-f3fd018f145ffc02de03744259ba585d8152483f.zip |
Fix SI-4813 - Clone doesn't work on LinkedList.
* Added extensive test for clone across all standard mutable collections
* Fixed clone implementations when needed so they work.
Diffstat (limited to 'src')
6 files changed, 40 insertions, 6 deletions
diff --git a/src/library/scala/collection/mutable/ArrayBuffer.scala b/src/library/scala/collection/mutable/ArrayBuffer.scala index 3034fc2bce..d5308c3b1a 100644 --- a/src/library/scala/collection/mutable/ArrayBuffer.scala +++ b/src/library/scala/collection/mutable/ArrayBuffer.scala @@ -169,12 +169,6 @@ class ArrayBuffer[A](override protected val initialSize: Int) result } - /** Return a clone of this buffer. - * - * @return an `ArrayBuffer` with the same elements. - */ - override def clone(): ArrayBuffer[A] = new ArrayBuffer[A] ++= this - def result: ArrayBuffer[A] = this /** Defines the prefix of the string representation. diff --git a/src/library/scala/collection/mutable/ArraySeq.scala b/src/library/scala/collection/mutable/ArraySeq.scala index d0eaee348b..60baf7b35b 100644 --- a/src/library/scala/collection/mutable/ArraySeq.scala +++ b/src/library/scala/collection/mutable/ArraySeq.scala @@ -89,6 +89,13 @@ extends AbstractSeq[A] Array.copy(array, 0, xs, start, len1) } + override def clone(): ArraySeq[A] = { + val cloned = array.clone.asInstanceOf[Array[AnyRef]] + new ArraySeq[A](length) { + override val array = cloned + } + } + } /** $factoryInfo diff --git a/src/library/scala/collection/mutable/BufferLike.scala b/src/library/scala/collection/mutable/BufferLike.scala index 3274fe6194..e77c1256a0 100644 --- a/src/library/scala/collection/mutable/BufferLike.scala +++ b/src/library/scala/collection/mutable/BufferLike.scala @@ -252,4 +252,14 @@ trait BufferLike[A, +This <: BufferLike[A, This] with Buffer[A]] */ @migration("`--` creates a new buffer. Use `--=` to remove an element from this buffer and return that buffer itself.", "2.8.0") override def --(xs: GenTraversableOnce[A]): This = clone() --= xs.seq + + /** Return a clone of this buffer. + * + * @return a `Buffer` with the same elements. + */ + override def clone(): This = { + val bf = newBuilder + bf ++= this + bf.result.asInstanceOf[This] + } } diff --git a/src/library/scala/collection/mutable/LinkedListLike.scala b/src/library/scala/collection/mutable/LinkedListLike.scala index 07a8501ca4..59004a3de6 100644 --- a/src/library/scala/collection/mutable/LinkedListLike.scala +++ b/src/library/scala/collection/mutable/LinkedListLike.scala @@ -180,4 +180,14 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq these = these.next } } + + /** Return a clone of this list. + * + * @return a `LinkedList` with the same elements. + */ + override def clone(): This = { + val bf = newBuilder + bf ++= this + bf.result + } } diff --git a/src/library/scala/collection/mutable/MutableList.scala b/src/library/scala/collection/mutable/MutableList.scala index c9e44ac165..6fa1f4872a 100644 --- a/src/library/scala/collection/mutable/MutableList.scala +++ b/src/library/scala/collection/mutable/MutableList.scala @@ -140,6 +140,13 @@ extends AbstractSeq[A] } def result = this + + override def clone(): MutableList[A] = { + val bf = newBuilder + bf ++= seq + bf.result + } + } diff --git a/src/library/scala/collection/mutable/Queue.scala b/src/library/scala/collection/mutable/Queue.scala index 21c3a84699..fc7e76125e 100644 --- a/src/library/scala/collection/mutable/Queue.scala +++ b/src/library/scala/collection/mutable/Queue.scala @@ -177,6 +177,12 @@ extends MutableList[A] tl.len = len - 1 tl } + + override def clone(): Queue[A] = { + val bf = newBuilder + bf ++= seq + bf.result + } } |