summaryrefslogtreecommitdiff
path: root/src/library/scala/runtime/SeqCharSequence.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-05-04 02:22:51 -0700
committerPaul Phillips <paulp@improving.org>2012-05-04 18:24:16 -0700
commitb5e9e4b9502f02c3de31d32b71f82ea1e6723f01 (patch)
treeb6e1d9f4b394b79951f21c5bb980ace12d4fc8f7 /src/library/scala/runtime/SeqCharSequence.scala
parent0fb12fa0620c5f9999e309a4de7831549b283c24 (diff)
downloadscala-b5e9e4b9502f02c3de31d32b71f82ea1e6723f01.tar.gz
scala-b5e9e4b9502f02c3de31d32b71f82ea1e6723f01.tar.bz2
scala-b5e9e4b9502f02c3de31d32b71f82ea1e6723f01.zip
Have ArrayCharSequence reuse its Array.
Your know, for performance. Closes SI-5641.
Diffstat (limited to 'src/library/scala/runtime/SeqCharSequence.scala')
-rw-r--r--src/library/scala/runtime/SeqCharSequence.scala25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/library/scala/runtime/SeqCharSequence.scala b/src/library/scala/runtime/SeqCharSequence.scala
index 7f7bca789f..6bf88e0729 100644
--- a/src/library/scala/runtime/SeqCharSequence.scala
+++ b/src/library/scala/runtime/SeqCharSequence.scala
@@ -17,9 +17,24 @@ final class SeqCharSequence(val xs: collection.IndexedSeq[Char]) extends CharSeq
override def toString = xs.mkString("")
}
-final class ArrayCharSequence(val xs: Array[Char]) extends CharSequence {
- def length: Int = xs.length
- def charAt(index: Int): Char = xs(index)
- def subSequence(start: Int, end: Int): CharSequence = new ArrayCharSequence(copyOfRange(xs, math.max(0, start), math.min(xs.length, end)))
- override def toString = xs.mkString("")
+final class ArrayCharSequence(val xs: Array[Char], start: Int, end: Int) extends CharSequence {
+ def this(xs: Array[Char]) = this(xs, 0, xs.length)
+
+ def length: Int = math.max(0, end - start)
+ def charAt(index: Int): Char = {
+ if (0 <= index && index < length)
+ xs(start + index)
+ else throw new ArrayIndexOutOfBoundsException(index)
+ }
+ def subSequence(start0: Int, end0: Int): CharSequence = {
+ if (start0 < 0) throw new ArrayIndexOutOfBoundsException(start0)
+ else if (end0 > length) throw new ArrayIndexOutOfBoundsException(end0)
+ else if (end0 <= start0) new ArrayCharSequence(xs, 0, 0)
+ else {
+ val newlen = end0 - start0
+ val start1 = start + start0
+ new ArrayCharSequence(xs, start1, start1 + newlen)
+ }
+ }
+ override def toString = xs drop start take length mkString ""
}