MinMaxLen.java revision 953:221a84ef44c0
111820Sjulian/*
211820Sjulian * Permission is hereby granted, free of charge, to any person obtaining a copy of
311820Sjulian * this software and associated documentation files (the "Software"), to deal in
411820Sjulian * the Software without restriction, including without limitation the rights to
511820Sjulian * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
611820Sjulian * of the Software, and to permit persons to whom the Software is furnished to do
711820Sjulian * so, subject to the following conditions:
811820Sjulian *
911820Sjulian * The above copyright notice and this permission notice shall be included in all
1011820Sjulian * copies or substantial portions of the Software.
1111820Sjulian *
1211820Sjulian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1311820Sjulian * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1411820Sjulian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1511820Sjulian * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1611820Sjulian * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1711820Sjulian * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1811820Sjulian * SOFTWARE.
1911820Sjulian */
2011820Sjulianpackage jdk.nashorn.internal.runtime.regexp.joni;
2111820Sjulian
2211820Sjulianfinal class MinMaxLen {
2311820Sjulian    int min; /* min byte length */
2411820Sjulian    int max; /* max byte length */
2511820Sjulian
2611820Sjulian    MinMaxLen() {
2711820Sjulian    }
2811820Sjulian
2911820Sjulian    MinMaxLen(final int min, final int max) {
3011820Sjulian        this.min = min;
3111820Sjulian        this.max = max;
3211820Sjulian    }
3311820Sjulian
3411820Sjulian    /* 1000 / (min-max-dist + 1) */
3511820Sjulian    private static final short distValues[] = {
3611820Sjulian        1000,  500,  333,  250,  200,  167,  143,  125,  111,  100,
3750479Speter          91,   83,   77,   71,   67,   63,   59,   56,   53,   50,
3811820Sjulian          48,   45,   43,   42,   40,   38,   37,   36,   34,   33,
3911820Sjulian          32,   31,   30,   29,   29,   28,   27,   26,   26,   25,
4011820Sjulian          24,   24,   23,   23,   22,   22,   21,   21,   20,   20,
41122760Strhodes          20,   19,   19,   19,   18,   18,   18,   17,   17,   17,
4211820Sjulian          16,   16,   16,   16,   15,   15,   15,   15,   14,   14,
4311820Sjulian          14,   14,   14,   14,   13,   13,   13,   13,   13,   13,
4411820Sjulian          12,   12,   12,   12,   12,   12,   11,   11,   11,   11,
4511820Sjulian          11,   11,   11,   11,   11,   10,   10,   10,   10,   10
4611820Sjulian    };
4711820Sjulian
4811820Sjulian    int distanceValue() {
4911820Sjulian        if (max == INFINITE_DISTANCE) return 0;
5011820Sjulian        final int d = max - min;
5111820Sjulian        /* return dist_vals[d] * 16 / (mm->min + 12); */
5211820Sjulian        return d < distValues.length ? distValues[d] : 1;
5311820Sjulian    }
5411820Sjulian
5511820Sjulian    int compareDistanceValue(final MinMaxLen other, int v1, int v2) {
5611820Sjulian        if (v2 <= 0) return -1;
5711820Sjulian        if (v1 <= 0) return 1;
5811820Sjulian
5911820Sjulian        v1 *= distanceValue();
6011820Sjulian        v2 *= other.distanceValue();
6127244Sjhay
6211820Sjulian        if (v2 > v1) return 1;
6311820Sjulian        if (v2 < v1) return -1;
6411820Sjulian
6511820Sjulian        if (other.min < min) return 1;
6611820Sjulian        if (other.min > min) return -1;
6711820Sjulian        return 0;
6811820Sjulian    }
6911820Sjulian
7011820Sjulian    boolean equal(final MinMaxLen other) {
7111820Sjulian        return min == other.min && max == other.max;
7211820Sjulian    }
7311820Sjulian
7411820Sjulian    void set(final int min, final int max) {
7511820Sjulian        this.min = min;
7611820Sjulian        this.max = max;
7711820Sjulian    }
7811820Sjulian
7911820Sjulian    void clear() {
8011820Sjulian        min = max = 0;
8111820Sjulian    }
8211820Sjulian
8311820Sjulian    void copy(final MinMaxLen other) {
8411820Sjulian        min = other.min;
8511820Sjulian        max = other.max;
8611820Sjulian    }
8711820Sjulian
8811820Sjulian    void add(final MinMaxLen other) {
8911820Sjulian        min = distanceAdd(min, other.min);
9011820Sjulian        max = distanceAdd(max, other.max);
9111820Sjulian    }
9211820Sjulian
9311820Sjulian    void addLength(final int len) {
9411820Sjulian        min = distanceAdd(min, len);
9511820Sjulian        max = distanceAdd(max, len);
9611820Sjulian    }
9711820Sjulian
9811820Sjulian    void altMerge(final MinMaxLen other) {
9911820Sjulian        if (min > other.min) min = other.min;
10011820Sjulian        if (max < other.max) max = other.max;
10111820Sjulian    }
10211820Sjulian
10311820Sjulian    static final int INFINITE_DISTANCE = 0x7FFFFFFF;
10411820Sjulian    static int distanceAdd(final int d1, final int d2) {
10511820Sjulian        if (d1 == INFINITE_DISTANCE || d2 == INFINITE_DISTANCE) {
10611820Sjulian            return INFINITE_DISTANCE;
10711820Sjulian        } else {
10811820Sjulian            if (d1 <= INFINITE_DISTANCE - d2) return d1 + d2;
10911820Sjulian            else return INFINITE_DISTANCE;
11011820Sjulian        }
11111820Sjulian    }
11211820Sjulian
11311820Sjulian    static int distanceMultiply(final int d, final int m) {
11411820Sjulian        if (m == 0) return 0;
11511820Sjulian        if (d < INFINITE_DISTANCE / m) {
11611820Sjulian            return d * m;
11711820Sjulian        } else {
11811820Sjulian            return INFINITE_DISTANCE;
11911820Sjulian        }
12011820Sjulian    }
12111820Sjulian
12211820Sjulian    static String distanceRangeToString(final int a, final int b) {
12311820Sjulian        String s = "";
12411820Sjulian        if (a == INFINITE_DISTANCE) {
12511820Sjulian            s += "inf";
12611820Sjulian        } else {
12711820Sjulian            s += "(" + a + ")";
12811820Sjulian        }
12911820Sjulian
13011820Sjulian        s += "-";
13111820Sjulian
13211820Sjulian        if (b == INFINITE_DISTANCE) {
13311820Sjulian            s += "inf";
13411820Sjulian        } else {
13511820Sjulian            s += "(" + b + ")";
13611820Sjulian        }
13711820Sjulian        return s;
13811820Sjulian    }
13911820Sjulian}
14011820Sjulian