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