/* GENERATED SOURCE. DO NOT MODIFY. */ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2016, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* */ package android.icu.util; import java.util.concurrent.ConcurrentHashMap; /** * Class to store version numbers of the form major.minor.milli.micro. * @author synwee */ public final class VersionInfo implements Comparable { // public data members ------------------------------------------------- /** * Unicode 1.0 version */ public static final VersionInfo UNICODE_1_0; /** * Unicode 1.0.1 version */ public static final VersionInfo UNICODE_1_0_1; /** * Unicode 1.1.0 version */ public static final VersionInfo UNICODE_1_1_0; /** * Unicode 1.1.5 version */ public static final VersionInfo UNICODE_1_1_5; /** * Unicode 2.0 version */ public static final VersionInfo UNICODE_2_0; /** * Unicode 2.1.2 version */ public static final VersionInfo UNICODE_2_1_2; /** * Unicode 2.1.5 version */ public static final VersionInfo UNICODE_2_1_5; /** * Unicode 2.1.8 version */ public static final VersionInfo UNICODE_2_1_8; /** * Unicode 2.1.9 version */ public static final VersionInfo UNICODE_2_1_9; /** * Unicode 3.0 version */ public static final VersionInfo UNICODE_3_0; /** * Unicode 3.0.1 version */ public static final VersionInfo UNICODE_3_0_1; /** * Unicode 3.1.0 version */ public static final VersionInfo UNICODE_3_1_0; /** * Unicode 3.1.1 version */ public static final VersionInfo UNICODE_3_1_1; /** * Unicode 3.2 version */ public static final VersionInfo UNICODE_3_2; /** * Unicode 4.0 version */ public static final VersionInfo UNICODE_4_0; /** * Unicode 4.0.1 version */ public static final VersionInfo UNICODE_4_0_1; /** * Unicode 4.1 version */ public static final VersionInfo UNICODE_4_1; /** * Unicode 5.0 version */ public static final VersionInfo UNICODE_5_0; /** * Unicode 5.1 version */ public static final VersionInfo UNICODE_5_1; /** * Unicode 5.2 version */ public static final VersionInfo UNICODE_5_2; /** * Unicode 6.0 version */ public static final VersionInfo UNICODE_6_0; /** * Unicode 6.1 version */ public static final VersionInfo UNICODE_6_1; /** * Unicode 6.2 version */ public static final VersionInfo UNICODE_6_2; /** * Unicode 6.3 version */ public static final VersionInfo UNICODE_6_3; /** * Unicode 7.0 version */ public static final VersionInfo UNICODE_7_0; /** * Unicode 8.0 version */ public static final VersionInfo UNICODE_8_0; /** * Unicode 9.0 version */ public static final VersionInfo UNICODE_9_0; /** * Unicode 10.0 version */ public static final VersionInfo UNICODE_10_0; /** * Unicode 11.0 version */ public static final VersionInfo UNICODE_11_0; /** * Unicode 12.0 version */ public static final VersionInfo UNICODE_12_0; /** * Unicode 12.1 version */ public static final VersionInfo UNICODE_12_1; /** * Unicode 13.0 version */ public static final VersionInfo UNICODE_13_0; /** * Unicode 14.0 version */ public static final VersionInfo UNICODE_14_0; /** * Unicode 15.0 version */ public static final VersionInfo UNICODE_15_0; /** * Unicode 15.1 version */ @android.annotation.FlaggedApi(com.android.icu.Flags.FLAG_ICU_V_API) public static final VersionInfo UNICODE_15_1; /** * ICU4J current release version */ public static final VersionInfo ICU_VERSION; /** * Data version string for ICU's internal data. * Used for appending to data path (e.g. icudt43b) * @deprecated This API is ICU internal only. * @hide original deprecated declaration * @hide draft / provisional / internal are hidden on Android */ @Deprecated public static final String ICU_DATA_VERSION_PATH = "75b"; /** * Data version in ICU4J. * @deprecated This API is ICU internal only. * @hide original deprecated declaration * @hide draft / provisional / internal are hidden on Android */ @Deprecated public static final VersionInfo ICU_DATA_VERSION; /** * Collation runtime version (sort key generator, string comparisons). * If the version is different, sort keys for the same string could be different. * This value may change in subsequent releases of ICU. */ public static final VersionInfo UCOL_RUNTIME_VERSION; /** * Collation builder code version. * When this is different, the same tailoring might result * in assigning different collation elements to code points. * This value may change in subsequent releases of ICU. */ public static final VersionInfo UCOL_BUILDER_VERSION; /** * Constant version 1. * This was intended to be the version of collation tailorings, * but instead the tailoring data carries a version number. * @deprecated ICU 54 * @hide original deprecated declaration */ @Deprecated public static final VersionInfo UCOL_TAILORINGS_VERSION; // public methods ------------------------------------------------------ /** * Returns an instance of VersionInfo with the argument version. * @param version version String in the format of "major.minor.milli.micro" * or "major.minor.milli" or "major.minor" or "major", * where major, minor, milli, micro are non-negative numbers * <= 255. If the trailing version numbers are * not specified they are taken as 0s. E.g. Version "3.1" is * equivalent to "3.1.0.0". * @return an instance of VersionInfo with the argument version. * @exception IllegalArgumentException when the argument version * is not in the right format */ public static VersionInfo getInstance(String version) { int length = version.length(); int array[] = {0, 0, 0, 0}; int count = 0; int index = 0; while (count < 4 && index < length) { char c = version.charAt(index); if (c == '.') { count ++; } else { c -= '0'; if (c < 0 || c > 9) { throw new IllegalArgumentException(INVALID_VERSION_NUMBER_); } array[count] *= 10; array[count] += c; } index ++; } if (index != length) { throw new IllegalArgumentException( "Invalid version number: String '" + version + "' exceeds version format"); } for (int i = 0; i < 4; i ++) { if (array[i] < 0 || array[i] > 255) { throw new IllegalArgumentException(INVALID_VERSION_NUMBER_); } } return getInstance(array[0], array[1], array[2], array[3]); } /** * Returns an instance of VersionInfo with the argument version. * @param major major version, non-negative number <= 255. * @param minor minor version, non-negative number <= 255. * @param milli milli version, non-negative number <= 255. * @param micro micro version, non-negative number <= 255. * @exception IllegalArgumentException when either arguments are negative or > 255 */ public static VersionInfo getInstance(int major, int minor, int milli, int micro) { // checks if it is in the hashmap // else if (major < 0 || major > 255 || minor < 0 || minor > 255 || milli < 0 || milli > 255 || micro < 0 || micro > 255) { throw new IllegalArgumentException(INVALID_VERSION_NUMBER_); } int version = getInt(major, minor, milli, micro); Integer key = version; VersionInfo result = MAP_.get(key); if (result == null) { result = new VersionInfo(version); VersionInfo tmpvi = MAP_.putIfAbsent(key, result); if (tmpvi != null) { result = tmpvi; } } return result; } /** * Returns an instance of VersionInfo with the argument version. * Equivalent to getInstance(major, minor, milli, 0). * @param major major version, non-negative number <= 255. * @param minor minor version, non-negative number <= 255. * @param milli milli version, non-negative number <= 255. * @exception IllegalArgumentException when either arguments are * negative or > 255 */ public static VersionInfo getInstance(int major, int minor, int milli) { return getInstance(major, minor, milli, 0); } /** * Returns an instance of VersionInfo with the argument version. * Equivalent to getInstance(major, minor, 0, 0). * @param major major version, non-negative number <= 255. * @param minor minor version, non-negative number <= 255. * @exception IllegalArgumentException when either arguments are * negative or > 255 */ public static VersionInfo getInstance(int major, int minor) { return getInstance(major, minor, 0, 0); } /** * Returns an instance of VersionInfo with the argument version. * Equivalent to getInstance(major, 0, 0, 0). * @param major major version, non-negative number <= 255. * @exception IllegalArgumentException when either arguments are * negative or > 255 */ public static VersionInfo getInstance(int major) { return getInstance(major, 0, 0, 0); } /** * Returns the String representative of VersionInfo in the format of * "major.minor.milli.micro" * @return String representative of VersionInfo */ @Override public String toString() { StringBuilder result = new StringBuilder(7); result.append(getMajor()); result.append('.'); result.append(getMinor()); result.append('.'); result.append(getMilli()); result.append('.'); result.append(getMicro()); return result.toString(); } /** * Returns the major version number * @return the major version number */ public int getMajor() { return (m_version_ >> 24) & LAST_BYTE_MASK_ ; } /** * Returns the minor version number * @return the minor version number */ public int getMinor() { return (m_version_ >> 16) & LAST_BYTE_MASK_ ; } /** * Returns the milli version number * @return the milli version number */ public int getMilli() { return (m_version_ >> 8) & LAST_BYTE_MASK_ ; } /** * Returns the micro version number * @return the micro version number */ public int getMicro() { return m_version_ & LAST_BYTE_MASK_ ; } /** * Checks if this version information is equals to the argument version * @param other object to be compared * @return true if other is equals to this object's version information, * false otherwise */ @Override public boolean equals(Object other) { return other == this; } /** * Returns the hash code value for this set. * * @return the hash code value for this set. * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return m_version_; } /** * Compares other with this VersionInfo. * @param other VersionInfo to be compared * @return 0 if the argument is a VersionInfo object that has version * information equals to this object. * Less than 0 if the argument is a VersionInfo object that has * version information greater than this object. * Greater than 0 if the argument is a VersionInfo object that * has version information less than this object. */ @Override public int compareTo(VersionInfo other) { // m_version_ is an int, a signed 32-bit integer. // When the major version is >=128, then the version int is negative. // Compare it in two steps to simulate an unsigned-int comparison. // (Alternatively we could turn each int into a long and reset the upper 32 bits.) // Compare the upper bits first, using logical shift right (unsigned). int diff = (m_version_ >>> 1) - (other.m_version_ >>> 1); if (diff != 0) { return diff; } // Compare the remaining bits. return (m_version_ & 1) - (other.m_version_ & 1); } // private data members ---------------------------------------------- /** * Unicode data version used by the current release. * Defined here privately for printing by the main() method in this class. * Should be the same as {@link android.icu.lang.UCharacter#getUnicodeVersion()} * which gets the version number from a data file. * We do not want VersionInfo to have an import dependency on UCharacter. */ private static final VersionInfo UNICODE_VERSION; /** * Version number stored as a byte for each of the major, minor, milli and * micro numbers in the 32 bit int. * Most significant for the major and the least significant contains the * micro numbers. */ private int m_version_; /** * Map of singletons */ private static final ConcurrentHashMap MAP_ = new ConcurrentHashMap<>(); /** * Last byte mask */ private static final int LAST_BYTE_MASK_ = 0xFF; /** * Error statement string */ private static final String INVALID_VERSION_NUMBER_ = "Invalid version number: Version number may be negative or greater than 255"; // static declaration ------------------------------------------------ /** * Initialize versions only after MAP_ has been created */ static { UNICODE_1_0 = getInstance(1, 0, 0, 0); UNICODE_1_0_1 = getInstance(1, 0, 1, 0); UNICODE_1_1_0 = getInstance(1, 1, 0, 0); UNICODE_1_1_5 = getInstance(1, 1, 5, 0); UNICODE_2_0 = getInstance(2, 0, 0, 0); UNICODE_2_1_2 = getInstance(2, 1, 2, 0); UNICODE_2_1_5 = getInstance(2, 1, 5, 0); UNICODE_2_1_8 = getInstance(2, 1, 8, 0); UNICODE_2_1_9 = getInstance(2, 1, 9, 0); UNICODE_3_0 = getInstance(3, 0, 0, 0); UNICODE_3_0_1 = getInstance(3, 0, 1, 0); UNICODE_3_1_0 = getInstance(3, 1, 0, 0); UNICODE_3_1_1 = getInstance(3, 1, 1, 0); UNICODE_3_2 = getInstance(3, 2, 0, 0); UNICODE_4_0 = getInstance(4, 0, 0, 0); UNICODE_4_0_1 = getInstance(4, 0, 1, 0); UNICODE_4_1 = getInstance(4, 1, 0, 0); UNICODE_5_0 = getInstance(5, 0, 0, 0); UNICODE_5_1 = getInstance(5, 1, 0, 0); UNICODE_5_2 = getInstance(5, 2, 0, 0); UNICODE_6_0 = getInstance(6, 0, 0, 0); UNICODE_6_1 = getInstance(6, 1, 0, 0); UNICODE_6_2 = getInstance(6, 2, 0, 0); UNICODE_6_3 = getInstance(6, 3, 0, 0); UNICODE_7_0 = getInstance(7, 0, 0, 0); UNICODE_8_0 = getInstance(8, 0, 0, 0); UNICODE_9_0 = getInstance(9, 0, 0, 0); UNICODE_10_0 = getInstance(10, 0, 0, 0); UNICODE_11_0 = getInstance(11, 0, 0, 0); UNICODE_12_0 = getInstance(12, 0, 0, 0); UNICODE_12_1 = getInstance(12, 1, 0, 0); UNICODE_13_0 = getInstance(13, 0, 0, 0); UNICODE_14_0 = getInstance(14, 0, 0, 0); UNICODE_15_0 = getInstance(15, 0, 0, 0); UNICODE_15_1 = getInstance(15, 1, 0, 0); ICU_VERSION = getInstance(75, 1, 0, 0); ICU_DATA_VERSION = ICU_VERSION; UNICODE_VERSION = UNICODE_15_1; UCOL_RUNTIME_VERSION = getInstance(9); UCOL_BUILDER_VERSION = getInstance(9); UCOL_TAILORINGS_VERSION = getInstance(1); } // private constructor ----------------------------------------------- /** * Constructor with int * @param compactversion a 32 bit int with each byte representing a number */ private VersionInfo(int compactversion) { m_version_ = compactversion; } /** * Gets the int from the version numbers * @param major non-negative version number * @param minor non-negative version number * @param milli non-negative version number * @param micro non-negative version number */ private static int getInt(int major, int minor, int milli, int micro) { return (major << 24) | (minor << 16) | (milli << 8) | micro; } ///CLOVER:OFF /** * Main method prints out ICU version information * @param args arguments (currently not used) * @hide unsupported on Android */ public static void main(String[] args) { String icuApiVer; if (ICU_VERSION.getMajor() <= 4) { if (ICU_VERSION.getMinor() % 2 != 0) { // Development mile stone int major = ICU_VERSION.getMajor(); int minor = ICU_VERSION.getMinor() + 1; if (minor >= 10) { minor -= 10; major++; } icuApiVer = "" + major + "." + minor + "M" + ICU_VERSION.getMilli(); } else { icuApiVer = ICU_VERSION.getVersionString(2, 2); } } else { if (ICU_VERSION.getMinor() == 0) { // Development mile stone icuApiVer = "" + ICU_VERSION.getMajor() + "M" + ICU_VERSION.getMilli(); } else { icuApiVer = ICU_VERSION.getVersionString(2, 2); } } System.out.println("International Components for Unicode for Java " + icuApiVer); System.out.println(""); System.out.println("Implementation Version: " + ICU_VERSION.getVersionString(2, 4)); System.out.println("Unicode Data Version: " + UNICODE_VERSION.getVersionString(2, 4)); System.out.println("CLDR Data Version: " + LocaleData.getCLDRVersion().getVersionString(2, 4)); System.out.println("Time Zone Data Version: " + getTZDataVersion()); } /** * Generate version string separated by dots with * the specified digit width. Version digit 0 * after minDigits will be trimmed off. * @param minDigits Minimum number of version digits * @param maxDigits Maximum number of version digits * @return A tailored version string * @deprecated This API is ICU internal only. (For use in CLDR, etc.) * @hide original deprecated declaration * @hide draft / provisional / internal are hidden on Android */ @Deprecated public String getVersionString(int minDigits, int maxDigits) { if (minDigits < 1 || maxDigits < 1 || minDigits > 4 || maxDigits > 4 || minDigits > maxDigits) { throw new IllegalArgumentException("Invalid min/maxDigits range"); } int[] digits = new int[4]; digits[0] = getMajor(); digits[1] = getMinor(); digits[2] = getMilli(); digits[3] = getMicro(); int numDigits = maxDigits; while (numDigits > minDigits) { if (digits[numDigits - 1] != 0) { break; } numDigits--; } StringBuilder verStr = new StringBuilder(7); verStr.append(digits[0]); for (int i = 1; i < numDigits; i++) { verStr.append("."); verStr.append(digits[i]); } return verStr.toString(); } ///CLOVER:ON // Moved from TimeZone class private static volatile String TZDATA_VERSION = null; static String getTZDataVersion() { if (TZDATA_VERSION == null) { synchronized (VersionInfo.class) { if (TZDATA_VERSION == null) { UResourceBundle tzbundle = UResourceBundle.getBundleInstance("android/icu/impl/data/icudt" + VersionInfo.ICU_DATA_VERSION_PATH, "zoneinfo64"); TZDATA_VERSION = tzbundle.getString("TZVersion"); } } } return TZDATA_VERSION; } }