Merge pull request #16474 from Christoph Dreis
* gh-16474: Speed up element equality checks in ConfigurationPropertyName Closes gh-16474
This commit is contained in:
commit
b39fdea508
|
@ -237,12 +237,7 @@ public final class ConfigurationPropertyName
|
|||
if (this.getNumberOfElements() >= name.getNumberOfElements()) {
|
||||
return false;
|
||||
}
|
||||
for (int i = this.elements.getSize() - 1; i >= 0; i--) {
|
||||
if (!elementEquals(this.elements, name.elements, i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return elementsEqual(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -309,15 +304,34 @@ public final class ConfigurationPropertyName
|
|||
&& other.elements.canShortcutWithSource(ElementType.UNIFORM)) {
|
||||
return toString().equals(other.toString());
|
||||
}
|
||||
return elementsEqual(other);
|
||||
}
|
||||
|
||||
private boolean elementsEqual(ConfigurationPropertyName name) {
|
||||
for (int i = this.elements.getSize() - 1; i >= 0; i--) {
|
||||
if (!elementEquals(this.elements, other.elements, i)) {
|
||||
if (elementDiffers(this.elements, name.elements, i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean elementEquals(Elements e1, Elements e2, int i) {
|
||||
private boolean elementDiffers(Elements e1, Elements e2, int i) {
|
||||
ElementType type1 = e1.getType(i);
|
||||
ElementType type2 = e2.getType(i);
|
||||
if (type1.allowsFastEqualityCheck() && type2.allowsFastEqualityCheck()) {
|
||||
return !fastElementEquals(e1, e2, i);
|
||||
}
|
||||
else if (type1.allowsDashIgnoringEqualityCheck()
|
||||
&& type2.allowsDashIgnoringEqualityCheck()) {
|
||||
return !dashIgnoringElementEquals(e1, e2, i);
|
||||
}
|
||||
else {
|
||||
return !defaultElementEquals(e1, e2, i);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean defaultElementEquals(Elements e1, Elements e2, int i) {
|
||||
int l1 = e1.getLength(i);
|
||||
int l2 = e2.getLength(i);
|
||||
boolean indexed1 = e1.getType(i).isIndexed();
|
||||
|
@ -355,6 +369,59 @@ public final class ConfigurationPropertyName
|
|||
return true;
|
||||
}
|
||||
|
||||
private boolean dashIgnoringElementEquals(Elements e1, Elements e2, int i) {
|
||||
int l1 = e1.getLength(i);
|
||||
int l2 = e2.getLength(i);
|
||||
int i1 = 0;
|
||||
int i2 = 0;
|
||||
while (i1 < l1) {
|
||||
if (i2 >= l2) {
|
||||
return false;
|
||||
}
|
||||
char ch1 = e1.charAt(i, i1);
|
||||
char ch2 = e2.charAt(i, i2);
|
||||
if (ch1 == '-') {
|
||||
i1++;
|
||||
}
|
||||
else if (ch2 == '-') {
|
||||
i2++;
|
||||
}
|
||||
else if (ch1 != ch2) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
i1++;
|
||||
i2++;
|
||||
}
|
||||
}
|
||||
boolean indexed2 = e2.getType(i).isIndexed();
|
||||
while (i2 < l2) {
|
||||
char ch2 = e2.charAt(i, i2++);
|
||||
if (indexed2 || ch2 == '-') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean fastElementEquals(Elements e1, Elements e2, int i) {
|
||||
int length1 = e1.getLength(i);
|
||||
int length2 = e2.getLength(i);
|
||||
if (length1 == length2) {
|
||||
int i1 = 0;
|
||||
while (length1-- != 0) {
|
||||
char ch1 = e1.charAt(i, i1);
|
||||
char ch2 = e2.charAt(i, i1);
|
||||
if (ch1 != ch2) {
|
||||
return false;
|
||||
}
|
||||
i1++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 0;
|
||||
|
@ -913,6 +980,14 @@ public final class ConfigurationPropertyName
|
|||
return this.indexed;
|
||||
}
|
||||
|
||||
public boolean allowsFastEqualityCheck() {
|
||||
return this == UNIFORM || this == NUMERICALLY_INDEXED;
|
||||
}
|
||||
|
||||
public boolean allowsDashIgnoringEqualityCheck() {
|
||||
return allowsFastEqualityCheck() || this == DASHED;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue