summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-08-23 16:57:10 +0000
committerPaul Phillips <paulp@improving.org>2010-08-23 16:57:10 +0000
commit79a7191e605d22ffe9d2142039f586682c6902d6 (patch)
treea2efb969100277f161929523591a96d6f4a5902d
parent3db5daf609b4c67ce1a236eb4c99a0fdc008581d (diff)
downloadscala-79a7191e605d22ffe9d2142039f586682c6902d6.tar.gz
scala-79a7191e605d22ffe9d2142039f586682c6902d6.tar.bz2
scala-79a7191e605d22ffe9d2142039f586682c6902d6.zip
Fix and test case for broken linked lists, cont...
Fix and test case for broken linked lists, contributed by Lucien Pereira. Closes #3361, no review.
-rw-r--r--src/library/scala/collection/mutable/DoubleLinkedList.scala16
-rw-r--r--src/library/scala/collection/mutable/LinkedListLike.scala3
-rw-r--r--test/files/run/t3361.scala100
3 files changed, 112 insertions, 7 deletions
diff --git a/src/library/scala/collection/mutable/DoubleLinkedList.scala b/src/library/scala/collection/mutable/DoubleLinkedList.scala
index e702301703..d3c86953c8 100644
--- a/src/library/scala/collection/mutable/DoubleLinkedList.scala
+++ b/src/library/scala/collection/mutable/DoubleLinkedList.scala
@@ -69,15 +69,21 @@ object DoubleLinkedList extends SeqFactory[DoubleLinkedList] {
def newBuilder[A]: Builder[A, DoubleLinkedList[A]] =
new Builder[A, DoubleLinkedList[A]] {
var current: DoubleLinkedList[A] = _
+ val emptyList = new DoubleLinkedList[A]()
+ if(null == current)
+ current = emptyList
+
def +=(elem: A): this.type = {
- val tmp = new DoubleLinkedList(elem, null)
- if (current != null)
- current.insert(tmp)
+ if (current.nonEmpty)
+ current.insert(new DoubleLinkedList(elem, emptyList))
else
- current = tmp
+ current = new DoubleLinkedList(elem, emptyList)
this
}
- def clear() { current = null }
+
+ def clear() {
+ current = emptyList
+ }
def result() = current
}
}
diff --git a/src/library/scala/collection/mutable/LinkedListLike.scala b/src/library/scala/collection/mutable/LinkedListLike.scala
index ca904e0a24..6fb516d566 100644
--- a/src/library/scala/collection/mutable/LinkedListLike.scala
+++ b/src/library/scala/collection/mutable/LinkedListLike.scala
@@ -66,8 +66,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq
def insert(that: This): Unit = {
require(nonEmpty, "insert into empty list")
if (that.nonEmpty) {
- that.append(next)
- next = that
+ next = next.append(that)
}
}
diff --git a/test/files/run/t3361.scala b/test/files/run/t3361.scala
new file mode 100644
index 0000000000..3e6fc30c8f
--- /dev/null
+++ b/test/files/run/t3361.scala
@@ -0,0 +1,100 @@
+object Test extends Application {
+ import scala.collection.mutable.DoubleLinkedList
+
+ empty
+ builder_1
+ builder_2
+ chaining_1
+ chaining_2
+ insert_1
+ insert_2
+ append_1
+ append_2
+
+ def empty {
+ val none = DoubleLinkedList()
+ require(none.size == 0)
+ none.foreach( _ => require(false))
+ }
+
+ def builder_1 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ require(10 == ten.size)
+ }
+
+ def builder_2 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ require((ten.size*(ten.size+1))/2 == ten.reduceLeft(_ + _))
+ }
+
+ def chaining_1 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ require(ten.reverse == DoubleLinkedList((1 to 10).reverse: _*))
+ }
+
+ def chaining_2 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ require(ten == ten.reverse.reverse)
+ }
+
+ def insert_1 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ ten.insert(DoubleLinkedList(11)) match {
+ case _: Unit => require(true)
+ case _ => require(false)
+ }
+ // Post-insert size test
+ require(11 == ten.size)
+ // Post-insert data test
+ require((ten.size*(ten.size+1))/2 == ten.reduceLeft(_ + _))
+ // Post-insert chaining test
+ require(ten == ten.reverse.reverse)
+ // Post-insert position test
+ require(ten.last == 11)
+ }
+
+ def insert_2 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ try {
+ DoubleLinkedList().insert(ten)
+ } catch {
+ case _: IllegalArgumentException => require(true)
+ case _ => require(false)
+ }
+ val zero = DoubleLinkedList(0)
+ zero.insert(ten)
+ require(zero.size == 11)
+ require(zero.head == 0)
+ require(zero.last == 10)
+ }
+
+ def append_1 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ val eleven = ten.append(DoubleLinkedList(11))
+ // Post-append equality test
+ require(ten == eleven)
+ // Post-append size test
+ require(11 == ten.size)
+ // Post-append data test
+ require((ten.size*(ten.size+1))/2 == ten.reduceLeft(_ + _))
+ // Post-append chaining test
+ require(ten == ten.reverse.reverse)
+ // Post-append position test
+ require(ten.last == 11)
+ }
+
+ def append_2 {
+ val ten = DoubleLinkedList(1 to 10: _*)
+ try {
+ DoubleLinkedList().append(ten)
+ } catch {
+ case _: IllegalArgumentException => require(true)
+ case _ => require(false)
+ }
+ val zero = DoubleLinkedList(0)
+ zero.append(ten)
+ require(zero.size == 11)
+ require(zero.head == 0)
+ require(zero.last == 10)
+ }
+}