13
0
geforkt von Mirrors/Paper

Optimize ChatColor.getLastColors.

ChatColor searches from the start to the end of a string for chat format
characters but this always has to search the entire string. By starting
from the end of the string and working backwards we can stop searching once
we find a color code or a reset code as any previous formatting is wiped
out by these.

By: Travis Watkins <amaranth@ubuntu.com>
Dieser Commit ist enthalten in:
Bukkit/Spigot 2012-05-16 18:12:48 -05:00
Ursprung f6c072f78f
Commit bceacc47c4
2 geänderte Dateien mit 22 neuen und 10 gelöschten Zeilen

Datei anzeigen

@ -218,19 +218,21 @@ public enum ChatColor {
*/ */
public static String getLastColors(String input) { public static String getLastColors(String input) {
String result = ""; String result = "";
int lastIndex = -1;
int length = input.length(); int length = input.length();
while ((lastIndex = input.indexOf(COLOR_CHAR, lastIndex + 1)) != -1) { // Search backwards from the end as it is faster
if (lastIndex < length - 1) { for (int index = length - 1; index > -1; index--) {
char c = input.charAt(lastIndex + 1); char section = input.charAt(index);
ChatColor col = getByChar(c); if (section == COLOR_CHAR && index < length - 1) {
char c = input.charAt(index + 1);
ChatColor color = getByChar(c);
if (col != null) { if (color != null) {
if (col.isColor()) { result = color.toString() + result;
result = col.toString();
} else if (col.isFormat()) { // Once we find a color or reset we can stop searching
result += col.toString(); if (color.isColor() || color.equals(RESET)) {
break;
} }
} }
} }

Datei anzeigen

@ -70,4 +70,14 @@ public class ChatColorTest {
String u = ChatColor.BLACK.toString() + ChatColor.DARK_BLUE + ChatColor.DARK_GREEN + ChatColor.DARK_AQUA + ChatColor.DARK_RED + ChatColor.DARK_PURPLE + ChatColor.GOLD + ChatColor.GRAY + ChatColor.DARK_GRAY + ChatColor.BLUE + ChatColor.GREEN + ChatColor.GREEN + ChatColor.AQUA + ChatColor.AQUA + ChatColor.RED + ChatColor.RED + ChatColor.LIGHT_PURPLE + ChatColor.LIGHT_PURPLE + ChatColor.YELLOW + ChatColor.YELLOW + ChatColor.WHITE + ChatColor.WHITE + ChatColor.MAGIC + ChatColor.MAGIC + " & more"; String u = ChatColor.BLACK.toString() + ChatColor.DARK_BLUE + ChatColor.DARK_GREEN + ChatColor.DARK_AQUA + ChatColor.DARK_RED + ChatColor.DARK_PURPLE + ChatColor.GOLD + ChatColor.GRAY + ChatColor.DARK_GRAY + ChatColor.BLUE + ChatColor.GREEN + ChatColor.GREEN + ChatColor.AQUA + ChatColor.AQUA + ChatColor.RED + ChatColor.RED + ChatColor.LIGHT_PURPLE + ChatColor.LIGHT_PURPLE + ChatColor.YELLOW + ChatColor.YELLOW + ChatColor.WHITE + ChatColor.WHITE + ChatColor.MAGIC + ChatColor.MAGIC + " & more";
assertThat(t, is(u)); assertThat(t, is(u));
} }
@Test
public void getChatColors() {
String s = String.format("%c%ctest%c%ctest%c", ChatColor.COLOR_CHAR, ChatColor.RED.getChar(), ChatColor.COLOR_CHAR, ChatColor.ITALIC.getChar(), ChatColor.COLOR_CHAR);
String expected = ChatColor.RED.toString() + ChatColor.ITALIC;
assertThat(ChatColor.getLastColors(s), is(expected));
s = String.format("%c%ctest%c%ctest", ChatColor.COLOR_CHAR, ChatColor.RED.getChar(), ChatColor.COLOR_CHAR, ChatColor.BLUE.getChar());
assertThat(ChatColor.getLastColors(s), is(ChatColor.BLUE.toString()));
}
} }