From 6f01130300eb9fb1e9797817b9cc8967208d38ce Mon Sep 17 00:00:00 2001 From: henryjen Date: Wed, 5 Jun 2013 15:56:51 -0700 Subject: [PATCH] 8015522: CharSequence.codePoints can be faster Reviewed-by: martin, psandoz, alanb Contributed-by: henry.jen@oracle.com --- src/share/classes/java/lang/CharSequence.java | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/share/classes/java/lang/CharSequence.java b/src/share/classes/java/lang/CharSequence.java index d34c1e02e..30a235908 100644 --- a/src/share/classes/java/lang/CharSequence.java +++ b/src/share/classes/java/lang/CharSequence.java @@ -179,10 +179,25 @@ public interface CharSequence { @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 interface CharSequence { } 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; } } -- GitLab