mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8276216: Negated character classes performance regression in Pattern
Reviewed-by: clanger
This commit is contained in:
parent
e3243ee963
commit
79350b9b4f
2 changed files with 113 additions and 23 deletions
|
@ -5605,50 +5605,69 @@ NEXT: while (i <= last) {
|
|||
}
|
||||
}
|
||||
|
||||
private static CharPredicate and(CharPredicate p1, CharPredicate p2,
|
||||
boolean bmpChar) {
|
||||
if (bmpChar) {
|
||||
return (BmpCharPredicate)(ch -> p1.is(ch) && p2.is(ch));
|
||||
} else {
|
||||
return (CharPredicate)(ch -> p1.is(ch) && p2.is(ch));
|
||||
}
|
||||
}
|
||||
|
||||
private static CharPredicate union(CharPredicate p1, CharPredicate p2,
|
||||
boolean bmpChar) {
|
||||
if (bmpChar) {
|
||||
return (BmpCharPredicate)(ch -> p1.is(ch) || p2.is(ch));
|
||||
} else {
|
||||
return (CharPredicate)(ch -> p1.is(ch) || p2.is(ch));
|
||||
}
|
||||
}
|
||||
|
||||
private static CharPredicate union(CharPredicate p1, CharPredicate p2,
|
||||
CharPredicate p3, boolean bmpChar) {
|
||||
if (bmpChar) {
|
||||
return (BmpCharPredicate)(ch -> p1.is(ch) || p2.is(ch) || p3.is(ch));
|
||||
} else {
|
||||
return (CharPredicate)(ch -> p1.is(ch) || p2.is(ch) || p3.is(ch));
|
||||
}
|
||||
}
|
||||
|
||||
private static CharPredicate negate(CharPredicate p1) {
|
||||
return (CharPredicate)(ch -> !p1.is(ch));
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
static interface CharPredicate {
|
||||
boolean is(int ch);
|
||||
|
||||
default CharPredicate and(CharPredicate p) {
|
||||
return ch -> is(ch) && p.is(ch);
|
||||
return Pattern.and(this, p, false);
|
||||
}
|
||||
default CharPredicate union(CharPredicate p) {
|
||||
return ch -> is(ch) || p.is(ch);
|
||||
return Pattern.union(this, p, false);
|
||||
}
|
||||
default CharPredicate union(CharPredicate p1,
|
||||
CharPredicate p2) {
|
||||
return ch -> is(ch) || p1.is(ch) || p2.is(ch);
|
||||
return Pattern.union(this, p1, p2, false);
|
||||
}
|
||||
default CharPredicate negate() {
|
||||
return ch -> !is(ch);
|
||||
return Pattern.negate(this);
|
||||
}
|
||||
}
|
||||
|
||||
static interface BmpCharPredicate extends CharPredicate {
|
||||
|
||||
default CharPredicate and(CharPredicate p) {
|
||||
if (p instanceof BmpCharPredicate)
|
||||
return (BmpCharPredicate)(ch -> is(ch) && p.is(ch));
|
||||
return ch -> is(ch) && p.is(ch);
|
||||
return Pattern.and(this, p, p instanceof BmpCharPredicate);
|
||||
}
|
||||
default CharPredicate union(CharPredicate p) {
|
||||
if (p instanceof BmpCharPredicate)
|
||||
return (BmpCharPredicate)(ch -> is(ch) || p.is(ch));
|
||||
return ch -> is(ch) || p.is(ch);
|
||||
return Pattern.union(this, p, p instanceof BmpCharPredicate);
|
||||
}
|
||||
static CharPredicate union(CharPredicate... predicates) {
|
||||
CharPredicate cp = ch -> {
|
||||
for (CharPredicate p : predicates) {
|
||||
if (!p.is(ch))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
for (CharPredicate p : predicates) {
|
||||
if (! (p instanceof BmpCharPredicate))
|
||||
return cp;
|
||||
}
|
||||
return (BmpCharPredicate)cp;
|
||||
default CharPredicate union(CharPredicate p1,
|
||||
CharPredicate p2) {
|
||||
return Pattern.union(this, p1, p2,
|
||||
p1 instanceof BmpCharPredicate &&
|
||||
p2 instanceof BmpCharPredicate);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue