| package com.ibm.text.utility; |
| import com.ibm.icu.text.UnicodeSet; |
| |
| final class UnicodeMapInt { |
| /* private int [] index = new int[1]; |
| private int [] data = new int[1]; |
| private int len = 1; |
| |
| index array is a set of inflection points; it and the data are always of the form |
| index: {MIN_VALUE, x, y, ..., q, MAX_VALUE} |
| data: {value for ..x-1, value for x..y-1, value for y..z-1, ..., value for q..} |
| AND no adjacent values are identical! |
| |
| |
| |
| public int put (int cp, int value) { |
| int i = findIndex(cp); |
| |
| // A1. if cp already has the value, return |
| if (data[i - 1] == value) return cp; |
| |
| int rangeStart = index[i-1]; |
| int rangeLimit = index[i]; |
| |
| // B. the range has one element |
| if (rangeStart + 1 == rangeLimit) { |
| // B1. the adjoining ranges have the new value: coelesce 3 into 1 |
| // B2. one adjoining range has the new value: coelesce 2 into 1 |
| // B3. otherwise: reset the value |
| |
| // C. we are at the start of the range |
| } else if (cp == rangeStart) { |
| // C1. the value is the same as the adjoining: extend the range |
| if (data[i-2] == value) { |
| ++index[i-1]; |
| } else { |
| // C2. otherwise add one new element/value pair |
| insertRange(i-1, 1); |
| index[i-1] = cp; |
| data[i-1] = value; |
| } |
| } else if (cp == rangeLimit - 1) { |
| // D. we are at the end of the range |
| // D1. the value is the same as the adjoining: extend the range |
| // D2. otherwise add one new element/value pair |
| // E. we are in the middle of the range: insert 2 element/value pairs |
| } else { |
| insertRange(i-1, 2); |
| index[i-1] = cp; |
| data[i-1] = value; |
| index[i] = cp+1; |
| data[i] = data[i-2]; |
| } |
| } |
| |
| public void put(int cpStart, int cpEnd, int value) { |
| for (int cp = cpStart; cp <= cpEnd; ++cp) { // later optimize |
| put(cp, value); |
| } |
| } |
| |
| public int get(int cp) { |
| return data[findIndex(cp) - 1]; |
| } |
| |
| *//** |
| * Returns the set of all characters that have the given value |
| *//* |
| public UnicodeSet getMatch(int value) { |
| UnicodeSet result = new UnicodeSet(); |
| for (int i = 0; i < len; ++i) { |
| if (data[i] == value) result.add(index[i], index[i+1]-1); |
| } |
| return result; |
| } |
| |
| *//** Finds the least index with a value greater than cp *//* |
| private int findIndex( int cp) { |
| if (cp > 0x10FFFF) throw new ArrayIndexOutOfBoundsException("Code point too large: " + cp); // out of bounds! |
| int i = -1; |
| while (true) { |
| if (cp < index[++i]) return i; |
| } |
| |
| } |
| |
| |
| public UnicodeSetIterator iterator() { |
| } |
| */ |
| } |
| |