Skip to content

Commit

Permalink
minor optimization for AsciiSet (#1061)
Browse files Browse the repository at this point in the history
Adjust containsAll check to an indexOf operation so when
doing the replacement the prefix of matching characters
do not need to be re-checked.
  • Loading branch information
brharrington committed May 12, 2023
1 parent 17ccbb5 commit 47f6b33
Showing 1 changed file with 13 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -188,13 +188,17 @@ public boolean contains(char c) {
* Returns true if all characters in the string are contained within the set.
*/
public boolean containsAll(CharSequence str) {
return indexOfNonMember(str) == str.length();
}

private int indexOfNonMember(CharSequence str) {
final int n = str.length();
for (int i = 0; i < n; ++i) {
if (!contains(str.charAt(i))) {
return false;
return i;
}
}
return true;
return n;
}

/**
Expand All @@ -204,7 +208,8 @@ public String replaceNonMembers(String input, char replacement) {
if (!contains(replacement)) {
throw new IllegalArgumentException(replacement + " is not a member of " + pattern);
}
return containsAll(input) ? input : replaceNonMembersImpl(input, replacement);
int i = indexOfNonMember(input);
return i < input.length() ? replaceNonMembersImpl(input, i, replacement) : input;
}

/**
Expand Down Expand Up @@ -254,14 +259,14 @@ public AsciiSet invert() {
return new AsciiSet(invertMembers);
}

private String replaceNonMembersImpl(String input, char replacement) {
private String replaceNonMembersImpl(String input, int start, char replacement) {
final int n = input.length();
final char[] buf = input.toCharArray();
for (int i = 0; i < n; ++i) {
final char c = buf[i];
if (!contains(c)) {
buf[start] = replacement;
for (int i = start + 1; i < n; ++i) {
final char c = input.charAt(i);
if (!contains(c))
buf[i] = replacement;
}
}
return newString(buf);
}
Expand Down

0 comments on commit 47f6b33

Please sign in to comment.