# HG changeset patch # User wenzelm # Date 1308655784 -7200 # Node ID 132f99cc0a43614fb48b849d7ba24701b329ad7f # Parent 39035276927c57f0d5c81c728c4d1b8f8a1d4ea0 tuned iteration over short symbols; diff -r 39035276927c -r 132f99cc0a43 src/Pure/General/symbol.scala --- a/src/Pure/General/symbol.scala Tue Jun 21 12:53:55 2011 +0200 +++ b/src/Pure/General/symbol.scala Tue Jun 21 13:29:44 2011 +0200 @@ -85,21 +85,38 @@ } - /* iterator */ + /* efficient iterators */ - def iterator(text: CharSequence) = new Iterator[CharSequence] - { - private val matcher = new Matcher(text) - private var i = 0 - def hasNext = i < text.length - def next = + def iterator(text: CharSequence): Iterator[CharSequence] = + new Iterator[CharSequence] { - val n = matcher(i, text.length) - val s = text.subSequence(i, i + n) - i += n - s + private val matcher = new Matcher(text) + private var i = 0 + def hasNext = i < text.length + def next = + { + val n = matcher(i, text.length) + val s = text.subSequence(i, i + n) + i += n + s + } } - } + + private val char_symbols: Array[String] = + (0 to 127).iterator.map(i => new String(Array(i.toChar))).toArray + + private def make_string(sym: CharSequence): String = + sym.length match { + case 0 => "" + case 1 => + val c = sym.charAt(0) + if (c < char_symbols.length) char_symbols(c) + else sym.toString + case _ => sym.toString + } + + def iterator_string(text: CharSequence): Iterator[String] = + iterator(text).map(make_string) /* decoding offsets */ diff -r 39035276927c -r 132f99cc0a43 src/Pure/Thy/html.scala --- a/src/Pure/Thy/html.scala Tue Jun 21 12:53:55 2011 +0200 +++ b/src/Pure/Thy/html.scala Tue Jun 21 13:29:44 2011 +0200 @@ -73,7 +73,7 @@ flush() ts += elem } - val syms = Symbol.iterator(txt).map(_.toString) + val syms = Symbol.iterator_string(txt) while (syms.hasNext) { val s1 = syms.next def s2() = if (syms.hasNext) syms.next else "" diff -r 39035276927c -r 132f99cc0a43 src/Tools/jEdit/src/token_markup.scala --- a/src/Tools/jEdit/src/token_markup.scala Tue Jun 21 12:53:55 2011 +0200 +++ b/src/Tools/jEdit/src/token_markup.scala Tue Jun 21 13:29:44 2011 +0200 @@ -90,7 +90,7 @@ } var offset = 0 var ctrl = "" - for (sym <- Symbol.iterator(text).map(_.toString)) { + for (sym <- Symbol.iterator_string(text)) { if (ctrl_style(sym).isDefined) ctrl = sym else if (ctrl != "") { if (symbols.is_controllable(sym) && sym != "\"" && !symbols.fonts.isDefinedAt(sym)) {