| /* GENERATED SOURCE. DO NOT MODIFY. */ |
| // © 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /* |
| ******************************************************************************* |
| * Copyright (C) 2009-2010, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| |
| package android.icu.impl.locale; |
| |
| |
| /** |
| * @hide Only a subset of ICU is exposed in Android |
| */ |
| public final class BaseLocale { |
| |
| private static final boolean JDKIMPL = false; |
| |
| public static final String SEP = "_"; |
| |
| private static final Cache CACHE = new Cache(); |
| public static final BaseLocale ROOT = BaseLocale.getInstance("", "", "", ""); |
| |
| private String _language = ""; |
| private String _script = ""; |
| private String _region = ""; |
| private String _variant = ""; |
| |
| private transient volatile int _hash = 0; |
| |
| private BaseLocale(String language, String script, String region, String variant) { |
| if (language != null) { |
| _language = AsciiUtil.toLowerString(language).intern(); |
| } |
| if (script != null) { |
| _script = AsciiUtil.toTitleString(script).intern(); |
| } |
| if (region != null) { |
| _region = AsciiUtil.toUpperString(region).intern(); |
| } |
| if (variant != null) { |
| if (JDKIMPL) { |
| // preserve upper/lower cases |
| _variant = variant.intern(); |
| } else { |
| _variant = AsciiUtil.toUpperString(variant).intern(); |
| } |
| } |
| } |
| |
| public static BaseLocale getInstance(String language, String script, String region, String variant) { |
| if (JDKIMPL) { |
| // JDK uses deprecated ISO639.1 language codes for he, yi and id |
| if (AsciiUtil.caseIgnoreMatch(language, "he")) { |
| language = "iw"; |
| } else if (AsciiUtil.caseIgnoreMatch(language, "yi")) { |
| language = "ji"; |
| } else if (AsciiUtil.caseIgnoreMatch(language, "id")) { |
| language = "in"; |
| } |
| } |
| Key key = new Key(language, script, region, variant); |
| BaseLocale baseLocale = CACHE.get(key); |
| return baseLocale; |
| } |
| |
| public String getLanguage() { |
| return _language; |
| } |
| |
| public String getScript() { |
| return _script; |
| } |
| |
| public String getRegion() { |
| return _region; |
| } |
| |
| public String getVariant() { |
| return _variant; |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| if (!(obj instanceof BaseLocale)) { |
| return false; |
| } |
| BaseLocale other = (BaseLocale)obj; |
| return hashCode() == other.hashCode() |
| && _language.equals(other._language) |
| && _script.equals(other._script) |
| && _region.equals(other._region) |
| && _variant.equals(other._variant); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder buf = new StringBuilder(); |
| if (_language.length() > 0) { |
| buf.append("language="); |
| buf.append(_language); |
| } |
| if (_script.length() > 0) { |
| if (buf.length() > 0) { |
| buf.append(", "); |
| } |
| buf.append("script="); |
| buf.append(_script); |
| } |
| if (_region.length() > 0) { |
| if (buf.length() > 0) { |
| buf.append(", "); |
| } |
| buf.append("region="); |
| buf.append(_region); |
| } |
| if (_variant.length() > 0) { |
| if (buf.length() > 0) { |
| buf.append(", "); |
| } |
| buf.append("variant="); |
| buf.append(_variant); |
| } |
| return buf.toString(); |
| } |
| |
| @Override |
| public int hashCode() { |
| int h = _hash; |
| if (h == 0) { |
| // Generating a hash value from language, script, region and variant |
| for (int i = 0; i < _language.length(); i++) { |
| h = 31*h + _language.charAt(i); |
| } |
| for (int i = 0; i < _script.length(); i++) { |
| h = 31*h + _script.charAt(i); |
| } |
| for (int i = 0; i < _region.length(); i++) { |
| h = 31*h + _region.charAt(i); |
| } |
| for (int i = 0; i < _variant.length(); i++) { |
| h = 31*h + _variant.charAt(i); |
| } |
| _hash = h; |
| } |
| return h; |
| } |
| |
| private static class Key implements Comparable<Key> { |
| private String _lang = ""; |
| private String _scrt = ""; |
| private String _regn = ""; |
| private String _vart = ""; |
| |
| private volatile int _hash; // Default to 0 |
| |
| public Key(String language, String script, String region, String variant) { |
| if (language != null) { |
| _lang = language; |
| } |
| if (script != null) { |
| _scrt = script; |
| } |
| if (region != null) { |
| _regn = region; |
| } |
| if (variant != null) { |
| _vart = variant; |
| } |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (JDKIMPL) { |
| return (this == obj) || |
| (obj instanceof Key) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._lang, this._lang) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._scrt, this._scrt) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._regn, this._regn) |
| && ((Key)obj)._vart.equals(_vart); // variant is case sensitive in JDK! |
| } |
| return (this == obj) || |
| (obj instanceof Key) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._lang, this._lang) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._scrt, this._scrt) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._regn, this._regn) |
| && AsciiUtil.caseIgnoreMatch(((Key)obj)._vart, this._vart); |
| } |
| |
| @Override |
| public int compareTo(Key other) { |
| int res = AsciiUtil.caseIgnoreCompare(this._lang, other._lang); |
| if (res == 0) { |
| res = AsciiUtil.caseIgnoreCompare(this._scrt, other._scrt); |
| if (res == 0) { |
| res = AsciiUtil.caseIgnoreCompare(this._regn, other._regn); |
| if (res == 0) { |
| if (JDKIMPL) { |
| res = this._vart.compareTo(other._vart); |
| } else { |
| res = AsciiUtil.caseIgnoreCompare(this._vart, other._vart); |
| } |
| } |
| } |
| } |
| return res; |
| } |
| |
| @Override |
| public int hashCode() { |
| int h = _hash; |
| if (h == 0) { |
| // Generating a hash value from language, script, region and variant |
| for (int i = 0; i < _lang.length(); i++) { |
| h = 31*h + AsciiUtil.toLower(_lang.charAt(i)); |
| } |
| for (int i = 0; i < _scrt.length(); i++) { |
| h = 31*h + AsciiUtil.toLower(_scrt.charAt(i)); |
| } |
| for (int i = 0; i < _regn.length(); i++) { |
| h = 31*h + AsciiUtil.toLower(_regn.charAt(i)); |
| } |
| for (int i = 0; i < _vart.length(); i++) { |
| if (JDKIMPL) { |
| h = 31*h + _vart.charAt(i); |
| } else { |
| h = 31*h + AsciiUtil.toLower(_vart.charAt(i)); |
| } |
| } |
| _hash = h; |
| } |
| return h; |
| } |
| |
| public static Key normalize(Key key) { |
| String lang = AsciiUtil.toLowerString(key._lang).intern(); |
| String scrt = AsciiUtil.toTitleString(key._scrt).intern(); |
| String regn = AsciiUtil.toUpperString(key._regn).intern(); |
| String vart; |
| if (JDKIMPL) { |
| // preserve upper/lower cases |
| vart = key._vart.intern(); |
| } else { |
| vart = AsciiUtil.toUpperString(key._vart).intern(); |
| } |
| return new Key(lang, scrt, regn, vart); |
| } |
| } |
| |
| private static class Cache extends LocaleObjectCache<Key, BaseLocale> { |
| |
| public Cache() { |
| } |
| |
| @Override |
| protected Key normalizeKey(Key key) { |
| return Key.normalize(key); |
| } |
| |
| @Override |
| protected BaseLocale createObject(Key key) { |
| return new BaseLocale(key._lang, key._scrt, key._regn, key._vart); |
| } |
| |
| } |
| } |