public AbstractStringBuilder reverse() {
boolean hasSurrogate = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; --j) {
char temp = value[j];
char temp2 = value[n - j];
if (!hasSurrogate) {
hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
|| (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
}
value[j] = temp2;
value[n - j] = temp;
}
if (hasSurrogate) {
// Reverse back all valid surrogate pairs
for (int i = 0; i < count - 1; i++) {
char c2 = value[i];
if (Character.isLowSurrogate(c2)) {
char c1 = value[i + 1];
if (Character.isHighSurrogate(c1)) {
value[i++] = c1;
value[i] = c2;
}
}
}
}
return this;
}
/**
* 'abc defg';
* count = 7-1;
* n=6
*
* j == 3;
*
* temp = 'd'; j = 3
* temp2 = 'd'; n-j = 3
* temp[3] = 'd';
* temp[3] ='d';
*
* j == 2;
* temp = 'c'; j=2
* temp = 'e'; n-j = 4
* temp[2] = 'e';
* temp[5] = 'c';
*
* j == 1;
* temp = 'b'; j=1
* temp2 = 'f'; n-j = 5
* temp[1] = 'f';
* temp[6] = 'b';
*
* j == 0;
* temp[6] = 'a';
* temp = 'a'; j=0
* temp2 = 'g'; n-j = 6;
* temp[0] = 'g';
* temp[6] = 'a';
**/