Daniel Kurka has uploaded a new change for review.
https://gwt-review.googlesource.com/2431
Change subject: add StringBuffer/Builder.reverse
......................................................................
add StringBuffer/Builder.reverse
fixes ISSUE 449
Change-Id: I342e7ed86c0e4efa90d09bdfe0d72c79db2654c5
---
M user/src/com/google/gwt/core/client/impl/StringBufferImpl.java
M user/src/com/google/gwt/core/client/impl/StringBufferImplAppend.java
M user/src/com/google/gwt/core/client/impl/StringBufferImplArrayBase.java
M user/super/com/google/gwt/emul/java/lang/StringBuffer.java
M user/super/com/google/gwt/emul/java/lang/StringBuilder.java
M user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
6 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/user/src/com/google/gwt/core/client/impl/StringBufferImpl.java
b/user/src/com/google/gwt/core/client/impl/StringBufferImpl.java
index 23a7202..1fc4887 100644
--- a/user/src/com/google/gwt/core/client/impl/StringBufferImpl.java
+++ b/user/src/com/google/gwt/core/client/impl/StringBufferImpl.java
@@ -29,6 +29,46 @@
*/
public abstract class StringBufferImpl {
+ public static String reverseString(String s) {
+ boolean hasSurrogatePairs = false;
+
+ int length = s.length();
+ char[] buffer = s.toCharArray();
+
+ int upper = length - 1;
+ int lower = 0;
+
+ while (lower < upper) {
+ char firstChar = buffer[lower];
+ char secondChar = buffer[upper];
+
+ if (!hasSurrogatePairs) {
+ hasSurrogatePairs =
+ (firstChar >= Character.MIN_SURROGATE && firstChar <=
Character.MAX_SURROGATE);
+ hasSurrogatePairs |=
+ (secondChar >= Character.MIN_SURROGATE && secondChar <=
Character.MAX_SURROGATE);
+ }
+ buffer[lower] = secondChar;
+ buffer[upper] = firstChar;
+ lower++;
+ upper--;
+ }
+
+ if (hasSurrogatePairs) {
+ for (int i = 0; i < length - 1; i++) {
+ char c = buffer[i];
+ if (Character.isLowSurrogate(c)) {
+ char c2 = buffer[i + 1];
+ if (Character.isHighSurrogate(c2)) {
+ buffer[i++] = c2;
+ buffer[i] = c;
+ }
+ }
+ }
+ }
+ return new String(buffer);
+ }
+
/**
* Append for primitive; the value can be stored and only later
converted to a
* string.
@@ -86,6 +126,11 @@
public abstract void replace(Object data, int start, int end, String
toInsert);
/**
+ * Reverses the whole StringBuffer/Builder
+ */
+ public abstract void reverse(Object data);
+
+ /**
* Returns the string buffer as a String.
*/
public abstract String toString(Object data);
diff --git
a/user/src/com/google/gwt/core/client/impl/StringBufferImplAppend.java
b/user/src/com/google/gwt/core/client/impl/StringBufferImplAppend.java
index 6dd2ed5..9d6e255 100644
--- a/user/src/com/google/gwt/core/client/impl/StringBufferImplAppend.java
+++ b/user/src/com/google/gwt/core/client/impl/StringBufferImplAppend.java
@@ -21,7 +21,7 @@
*/
public class StringBufferImplAppend extends StringBufferImpl {
private String string = "";
-
+
@Override
public void append(Object data, boolean x) {
string += x;
@@ -71,9 +71,15 @@
public void replace(Object data, int start, int end, String toInsert) {
string = string.substring(0, start) + toInsert + string.substring(end);
}
+
+ @Override
+ public void reverse(Object data) {
+ string = reverseString(string);
+ }
@Override
public String toString(Object data) {
return string;
}
+
}
diff --git
a/user/src/com/google/gwt/core/client/impl/StringBufferImplArrayBase.java
b/user/src/com/google/gwt/core/client/impl/StringBufferImplArrayBase.java
index 227ef93..82cfb68 100644
---
a/user/src/com/google/gwt/core/client/impl/StringBufferImplArrayBase.java
+++
b/user/src/com/google/gwt/core/client/impl/StringBufferImplArrayBase.java
@@ -76,6 +76,13 @@
}
@Override
+ public void reverse(Object a) {
+ String s = takeString(a);
+ s = reverseString(s);
+ appendNonNull(a, s);
+ }
+
+ @Override
public final String toString(Object a) {
String s = takeString(a);
appendNonNull(a, s);
@@ -87,4 +94,6 @@
a.length = a.explicitLength = 0;
return s;
}-*/;
+
+
}
diff --git a/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
b/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
index 2b24557..7a437a7 100644
--- a/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
+++ b/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
@@ -230,6 +230,11 @@
impl.replace(data, start, end, toInsert);
return this;
}
+
+ public StringBuffer reverse() {
+ impl.reverse(data);
+ return this;
+ }
/**
* Warning! This method is <b>much</b> slower than the JRE
implementation. If
diff --git a/user/super/com/google/gwt/emul/java/lang/StringBuilder.java
b/user/super/com/google/gwt/emul/java/lang/StringBuilder.java
index e6d495a..41b797b 100644
--- a/user/super/com/google/gwt/emul/java/lang/StringBuilder.java
+++ b/user/super/com/google/gwt/emul/java/lang/StringBuilder.java
@@ -230,6 +230,11 @@
impl.replace(data, start, end, toInsert);
return this;
}
+
+ public StringBuilder reserve() {
+ impl.reverse(data);
+ return this;
+ }
/**
* Warning! This method is <b>much</b> slower than the JRE
implementation. If
diff --git
a/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
b/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
index e92c177..70ccf5e 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
@@ -270,6 +270,12 @@
assertEquals("xxYYxx", x.toString());
}
+ public void testReverse() {
+ assertEquals("abcde", new StringBuffer("edcba").reverse().toString());
+ // surrogate pair test
+ assertEquals("\uD801\uDC00abce", new
StringBuffer("ecba\uD801\uDC00").reverse().toString());
+ }
+
/**
* This method tests <code>setLength</code>.
*/
--
To view, visit https://gwt-review.googlesource.com/2431
To unsubscribe, visit https://gwt-review.googlesource.com/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I342e7ed86c0e4efa90d09bdfe0d72c79db2654c5
Gerrit-PatchSet: 1
Gerrit-Project: gwt
Gerrit-Branch: master
Gerrit-Owner: Daniel Kurka <[email protected]>
--
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors
---
You received this message because you are subscribed to the Google Groups "Google Web Toolkit Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.