1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
3aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/*
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2002-2012, International Business Machines Corporation and    *
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.                                                *
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.util;
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Arrays;
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.List;
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Map;
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Set;
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UCharacter;
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UProperty;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Normalizer;
20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UTF16;
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UnicodeSet;
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UnicodeSetIterator;
23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Provides a general interface for Unicode Properties, and
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * extracting sets based on those values.
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @author Davis
29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic abstract class UnicodePropertySource implements Cloneable {
31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    protected String propertyAlias;
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    protected int m_nameChoice = UProperty.NameChoice.LONG;
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    protected StringFilter filter = new StringFilter();
35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    protected UnicodeSetIterator matchIterator = new UnicodeSetIterator(new UnicodeSet(0,0x10FFFF));
36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    abstract public String getPropertyValue(int codepoint);
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    abstract public Set getAvailablePropertyAliases(Set result);
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    abstract public Set getAvailablePropertyValueAliases(Set result);
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    abstract public String getPropertyAlias(int nameChoice);
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    abstract public String getPropertyValueAlias(String valueAlias, int nameChoice);
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Subclasses should override
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public Object clone() {
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            UnicodePropertySource result = (UnicodePropertySource)super.clone();
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.filter = (StringFilter)filter.clone();
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return result;
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (CloneNotSupportedException e) {
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            throw new IllegalStateException("Should never happen.");
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodePropertySource setPropertyAlias(String propertyAlias) {
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        this.propertyAlias = propertyAlias;
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return this;
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public String getPropertyAlias() {
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return propertyAlias;
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static final boolean equals(int codepoint, String other) {
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (other.length() == 1) {
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return codepoint == other.charAt(0);
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return other.equals(UTF16.valueOf(codepoint));
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodeSet getPropertySet(boolean charEqualsValue, UnicodeSet result){
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (result == null) result = new UnicodeSet();
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        matchIterator.reset();
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (matchIterator.next()) {
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String value = filter.remap(getPropertyValue(matchIterator.codepoint));
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (equals(matchIterator.codepoint, value) == charEqualsValue) {
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.add(matchIterator.codepoint);
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return result;
83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodeSet getPropertySet(String propertyValue, UnicodeSet result){
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (result == null) result = new UnicodeSet();
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        matchIterator.reset();
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (matchIterator.next()) {
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String value = filter.remap(getPropertyValue(matchIterator.codepoint));
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propertyValue.equals(value)) {
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.add(matchIterator.codepoint);
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return result;
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodeSet getPropertySet(Matcher matcher, UnicodeSet result) {
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (result == null) result = new UnicodeSet();
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        matchIterator.reset();
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (matchIterator.next()) {
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String value = filter.remap(getPropertyValue(matchIterator.codepoint));
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (value == null)
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                continue;
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matcher.matches(value)) {
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.add(matchIterator.codepoint);
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return result;
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public interface Matcher {
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public boolean matches(String value);
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public int getNameChoice() {
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return m_nameChoice;
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodePropertySource setNameChoice(int choice) {
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_nameChoice = choice;
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return this;
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static class StringFilter implements Cloneable {
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String remap(String original) {
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return original;
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public Object clone() {
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return super.clone();
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (CloneNotSupportedException e) {
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                throw new IllegalStateException("Should never happen.");
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static class MapFilter extends StringFilter {
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Map valueMap;
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String remap(String original) {
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Object changed = valueMap.get(original);
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return changed == null ? original : (String) changed;
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public Map getMap() {
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return valueMap;
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public MapFilter setMap(Map map) {
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            valueMap = map;
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return this;
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static public class ICU extends UnicodePropertySource {
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        protected int propEnum = Integer.MIN_VALUE;
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchIterator = new UnicodeSetIterator(
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new UnicodeSet("[^[:Cn:]-[:Default_Ignorable_Code_Point:]]"));
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public UnicodePropertySource setPropertyAlias(String propertyAlias) {
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            super.setPropertyAlias(propertyAlias);
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int extraPosition = Extras.indexOf(propertyAlias);
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (extraPosition >= 0) {
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                propEnum = EXTRA_START + extraPosition;
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                propEnum = UCharacter.getPropertyEnum(propertyAlias);
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return this;
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String getPropertyValue(int codePoint) {
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum < UProperty.INT_LIMIT) {
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum);
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getPropertyValueName(propEnum,enumValue, (int)m_nameChoice);
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (propEnum < UProperty.DOUBLE_LIMIT) {
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return Double.toString(UCharacter.getUnicodeNumericValue(codePoint));
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                // TODO: Fix HACK -- API deficient
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else switch(propEnum) {
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.AGE: return UCharacter.getAge(codePoint).toString();
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.BIDI_MIRRORING_GLYPH: return UTF16.valueOf(UCharacter.getMirror(codePoint));
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.CASE_FOLDING: return UCharacter.foldCase(UTF16.valueOf(codePoint),true);
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.ISO_COMMENT: return UCharacter.getISOComment(codePoint);
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.LOWERCASE_MAPPING: return UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint));
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.NAME: return UCharacter.getName(codePoint);
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.SIMPLE_CASE_FOLDING: return UTF16.valueOf(UCharacter.foldCase(codePoint,true));
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.SIMPLE_LOWERCASE_MAPPING: return UTF16.valueOf(UCharacter.toLowerCase(codePoint));
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.SIMPLE_TITLECASE_MAPPING: return UTF16.valueOf(UCharacter.toTitleCase(codePoint));
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.SIMPLE_UPPERCASE_MAPPING: return UTF16.valueOf(UCharacter.toUpperCase(codePoint));
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.TITLECASE_MAPPING: return UCharacter.toTitleCase(Locale.ENGLISH,UTF16.valueOf(codePoint),null);
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.UNICODE_1_NAME: return UCharacter.getName1_0(codePoint);
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case UProperty.UPPERCASE_MAPPING: return UCharacter.toUpperCase(Locale.ENGLISH,UTF16.valueOf(codePoint));
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case NFC: return Normalizer.normalize(codePoint, Normalizer.NFC);
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case NFD: return Normalizer.normalize(codePoint, Normalizer.NFD);
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case NFKC: return Normalizer.normalize(codePoint, Normalizer.NFKC);
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                case NFKD: return Normalizer.normalize(codePoint, Normalizer.NFKD);
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return null;
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        static final List Extras = Arrays.asList(new String[] {
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "NFC", "NFD", "NFKC", "NKFD"
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        });
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        static final int
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFC  = 0x8000,
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFD  = 0x8001,
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFKC = 0x8002,
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFKD = 0x8003,
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            EXTRA_START = NFC,
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            EXTRA_LIMIT = NFKD+1;
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        static final int[][] ranges = {
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {UProperty.BINARY_START,    UProperty.BINARY_LIMIT},
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {UProperty.INT_START,       UProperty.INT_LIMIT},
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {UProperty.DOUBLE_START,    UProperty.DOUBLE_LIMIT},
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {UProperty.STRING_START,    UProperty.STRING_LIMIT},
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public Set getAvailablePropertyAliases(Set result) {
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < ranges.length; ++i) {
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int j = ranges[i][0]; j < ranges[i][1]; ++j) {
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    result.add(UCharacter.getPropertyName(j, m_nameChoice));
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.addAll(Extras);
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return result;
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public Set getAvailablePropertyValueAliases(Set result) {
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum < UProperty.INT_LIMIT) {
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int start = UCharacter.getIntPropertyMinValue(propEnum);
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int end = UCharacter.getIntPropertyMaxValue(propEnum);
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int i = start; i <= end; ++i) {
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    result.add(getFixedValueAlias(null, i,m_nameChoice));
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.add(getFixedValueAlias(null, -1,m_nameChoice));
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return result;
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /**
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @param valueAlias null if unused.
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @param valueEnum -1 if unused
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @param nameChoice
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @return the alias
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private String getFixedValueAlias(String valueAlias, int valueEnum, int nameChoice) {
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum >= UProperty.STRING_START) {
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return "<string>";
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (propEnum >= UProperty.DOUBLE_START) {
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return "<double>";
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (valueAlias != null && !valueAlias.equals("<integer>")) {
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                valueEnum = UCharacter.getPropertyValueEnum(propEnum,valueAlias);
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String result = fixedGetPropertyValueName(propEnum, valueEnum, nameChoice);
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (result != null) return result;
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // try other namechoice
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = fixedGetPropertyValueName(propEnum,valueEnum,
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                nameChoice == UProperty.NameChoice.LONG ? UProperty.NameChoice.SHORT : UProperty.NameChoice.LONG);
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (result != null) return result;
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return "<integer>";
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private static String fixedGetPropertyValueName(int propEnum, int valueEnum, int nameChoice) {
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getPropertyValueName(propEnum,valueEnum,nameChoice);
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return null;
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String getPropertyAlias(int nameChoice) {
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum < EXTRA_START) {
276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getPropertyName(propEnum, nameChoice);
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return (String)Extras.get(propEnum-EXTRA_START);
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String getPropertyValueAlias(String valueAlias, int nameChoice) {
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return getFixedValueAlias(valueAlias, -1, nameChoice);
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // TODO file bug on getPropertyValueName for Canonical_Combining_Class
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public StringFilter getFilter() {
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return filter;
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodePropertySource setFilter(StringFilter filter) {
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        this.filter = filter;
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return this;
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static public void addAll(UnicodeSetIterator source, UnicodeSet result) {
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (source.nextRange()) {
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (source.codepoint == UnicodeSetIterator.IS_STRING) {
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.add(source.string);
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.add(source.codepoint, source.codepointEnd);
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodeSet getMatchSet(UnicodeSet result) {
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (result == null) result = new UnicodeSet();
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        addAll(matchIterator, result);
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return result;
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * @param set
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void setMatchSet(UnicodeSet set) {
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        matchIterator = new UnicodeSetIterator(set);
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
323