diff options
author | Paul Phillips <paulp@improving.org> | 2012-05-04 02:22:51 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-05-04 18:24:16 -0700 |
commit | b5e9e4b9502f02c3de31d32b71f82ea1e6723f01 (patch) | |
tree | b6e1d9f4b394b79951f21c5bb980ace12d4fc8f7 /src/library | |
parent | 0fb12fa0620c5f9999e309a4de7831549b283c24 (diff) | |
download | scala-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')
-rw-r--r-- | src/library/scala/runtime/SeqCharSequence.scala | 25 |
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 "" } |