# HG changeset patch # User henryjen # Date 1370473011 25200 # Node ID acb3c688a1b83539f30fdcc333f5ac7d2cc7fcc9 # Parent 885a02686acbb82f4d946ca6eb030c34e318670c 8015522: CharSequence.codePoints can be faster Reviewed-by: martin, psandoz, alanb Contributed-by: henry.jen@oracle.com diff -r 885a02686acb -r acb3c688a1b8 jdk/src/share/classes/java/lang/CharSequence.java --- a/jdk/src/share/classes/java/lang/CharSequence.java Wed Jun 05 08:41:02 2013 -0700 +++ b/jdk/src/share/classes/java/lang/CharSequence.java Wed Jun 05 15:56:51 2013 -0700 @@ -179,10 +179,25 @@ @Override public void forEachRemaining(IntConsumer block) { - while (cur < length()) { - int cp = Character.codePointAt(CharSequence.this, cur); - cur += Character.charCount(cp); - block.accept(cp); + final int length = length(); + int i = cur; + try { + while (i < length) { + char c1 = charAt(i++); + if (!Character.isHighSurrogate(c1) || i >= length) { + block.accept(c1); + } else { + char c2 = charAt(i); + if (Character.isLowSurrogate(c2)) { + i++; + block.accept(Character.toCodePoint(c1, c2)); + } else { + block.accept(c1); + } + } + } + } finally { + cur = i; } } @@ -191,12 +206,20 @@ } public int nextInt() { - if (!hasNext()) { + final int length = length(); + + if (cur >= length) { throw new NoSuchElementException(); } - int cp = Character.codePointAt(CharSequence.this, cur); - cur += Character.charCount(cp); - return cp; + char c1 = charAt(cur++); + if (Character.isHighSurrogate(c1) && cur < length) { + char c2 = charAt(cur); + if (Character.isLowSurrogate(c2)) { + cur++; + return Character.toCodePoint(c1, c2); + } + } + return c1; } }