aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/shedaniel/rei/client/SearchArgument.java
diff options
context:
space:
mode:
authorUnknown <shekwancheung0528@gmail.com>2019-06-18 16:38:49 +0800
committerUnknown <shekwancheung0528@gmail.com>2019-06-18 16:38:49 +0800
commit4d0b2d3f50bf56b83498a3b787ac08afaeb85eff (patch)
tree77c206a271fb6f5b6ae1dbe3d24d794420cf1841 /src/main/java/me/shedaniel/rei/client/SearchArgument.java
parent69a531030df74768d86025cd5668e0418a3c1f07 (diff)
downloadRoughlyEnoughItems-4d0b2d3f50bf56b83498a3b787ac08afaeb85eff.tar.gz
RoughlyEnoughItems-4d0b2d3f50bf56b83498a3b787ac08afaeb85eff.tar.bz2
RoughlyEnoughItems-4d0b2d3f50bf56b83498a3b787ac08afaeb85eff.zip
up to 4x faster search
Diffstat (limited to 'src/main/java/me/shedaniel/rei/client/SearchArgument.java')
-rw-r--r--src/main/java/me/shedaniel/rei/client/SearchArgument.java32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/main/java/me/shedaniel/rei/client/SearchArgument.java b/src/main/java/me/shedaniel/rei/client/SearchArgument.java
index 4c834ff1b..59ba0e0be 100644
--- a/src/main/java/me/shedaniel/rei/client/SearchArgument.java
+++ b/src/main/java/me/shedaniel/rei/client/SearchArgument.java
@@ -5,18 +5,19 @@
package me.shedaniel.rei.client;
+import java.util.Locale;
import java.util.function.Function;
import java.util.regex.Pattern;
public class SearchArgument {
- public static final Function<Integer, Boolean> INCLUDE = integer -> integer > -1;
- public static final Function<Integer, Boolean> NOT_INCLUDE = integer -> integer <= -1;
+ public static final SearchArgument ALWAYS = new SearchArgument(ArgumentType.ALWAYS, "", true);
private ArgumentType argumentType;
private String text;
+ public final Function<String, Boolean> INCLUDE = s -> boyerMooreHorspoolSearch(text, s) > -1;
+ public final Function<String, Boolean> NOT_INCLUDE = s -> boyerMooreHorspoolSearch(text, s) <= -1;
private boolean include;
private Pattern pattern;
- public static final SearchArgument ALWAYS = new SearchArgument(ArgumentType.ALWAYS, "", true);
public SearchArgument(ArgumentType argumentType, String text, boolean include) {
this(argumentType, text, include, true);
@@ -24,12 +25,31 @@ public class SearchArgument {
public SearchArgument(ArgumentType argumentType, String text, boolean include, boolean autoLowerCase) {
this.argumentType = argumentType;
- this.text = autoLowerCase ? text.toLowerCase() : text;
+ this.text = autoLowerCase ? text.toLowerCase(Locale.ROOT) : text;
this.include = include;
}
- public static Function<Integer, Boolean> getFunction(boolean include) {
- return include ? SearchArgument.INCLUDE : SearchArgument.NOT_INCLUDE;
+ public static int boyerMooreHorspoolSearch(CharSequence pattern, CharSequence text) {
+ int shift[] = new int[256];
+ for(int k = 0; k < 256; k++)
+ shift[k] = pattern.length();
+ for(int k = 0; k < pattern.length() - 1; k++)
+ shift[pattern.charAt(k)] = pattern.length() - 1 - k;
+ int i = 0, j = 0;
+ while ((i + pattern.length()) <= text.length()) {
+ j = pattern.length() - 1;
+ while (text.charAt(i + j) == pattern.charAt(j)) {
+ j -= 1;
+ if (j < 0)
+ return i;
+ }
+ i = i + shift[text.charAt(i + pattern.length() - 1)];
+ }
+ return -1;
+ }
+
+ public Function<String, Boolean> getFunction(boolean include) {
+ return include ? INCLUDE : NOT_INCLUDE;
}
public ArgumentType getArgumentType() {