summaryrefslogtreecommitdiff
path: root/src/library/scala/runtime/RichStringBuilder.scala
blob: 4d9e25cfac97f5f2e157d58407dab474b05ca347 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2002-2007, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */

// $Id$


package scala.runtime


import Predef._
import scala.collection.mutable.{Buffer,ArrayBuffer}

final class RichStringBuilder(val self : StringBuilder) extends RandomAccessSeq.Mutable[Char] with Proxy with Buffer[Char] {
  override def length = self.length
  override def apply(idx : Int) = self.charAt(idx)
  override def mkString = self.toString
  override def update(idx : Int, c : Char) = self.setCharAt(idx, c)
  override def +=(c: Char): Unit = self append c
  override def ++=(iter: Iterable[Char]): Unit = iter match {
  case str : RichString => self append str.self
  case str : Array[Char] => self append str
  case iter => super.++=(iter)
  }
  override def ++(iter: Iterable[Char]): RichStringBuilder = { this ++= iter; this }
  override def ++[B >: Char](that : Iterable[B]) : RandomAccessSeq[B] = {
    val buf = new ArrayBuffer[B]
    this copyToBuffer buf
    that copyToBuffer buf
    buf
  }


  override def insertAll(idx: Int, iter: Iterable[Char]): Unit = iter match {
  case str : RichString => self.insert(idx, str)
  case str : Array[Char] => self.insert(idx, str)
  case iter =>
    val i = iter.elements
    var jdx = idx
    while (i.hasNext) {
      self.insert(jdx, i.next)
      jdx = jdx + 1
    }
  }
  override def +:(c : Char) = self.insert(0, c)
  def ensureSize(size : Int) = self.ensureCapacity(size)
  override def remove(idx : Int) = {
    val c = self.charAt(idx)
    self.deleteCharAt(idx)
    c
  }
  override def clear = self.setLength(0)
}