1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html#License
3/*
4*******************************************************************************
5* Copyright (C) 2013-2015, International Business Machines
6* Corporation and others.  All Rights Reserved.
7*******************************************************************************
8* CollationTailoring.java, ported from collationtailoring.h/.cpp
9*
10* C++ version created on: 2013mar12
11* created by: Markus W. Scherer
12*/
13
14package com.ibm.icu.impl.coll;
15
16import java.util.Map;
17
18import com.ibm.icu.impl.Norm2AllModes;
19import com.ibm.icu.impl.Normalizer2Impl;
20import com.ibm.icu.impl.Trie2_32;
21import com.ibm.icu.text.UnicodeSet;
22import com.ibm.icu.util.ULocale;
23import com.ibm.icu.util.UResourceBundle;
24import com.ibm.icu.util.VersionInfo;
25
26/**
27 * Collation tailoring data & settings.
28 * This is a container of values for a collation tailoring
29 * built from rules or deserialized from binary data.
30 *
31 * It is logically immutable: Do not modify its values.
32 * The fields are public for convenience.
33 */
34public final class CollationTailoring {
35    CollationTailoring(SharedObject.Reference<CollationSettings> baseSettings) {
36        if(baseSettings != null) {
37            assert(baseSettings.readOnly().reorderCodes.length == 0);
38            assert(baseSettings.readOnly().reorderTable == null);
39            assert(baseSettings.readOnly().minHighNoReorder == 0);
40            settings = baseSettings.clone();
41        } else {
42            settings = new SharedObject.Reference<CollationSettings>(new CollationSettings());
43        }
44    }
45
46    void ensureOwnedData() {
47        if(ownedData == null) {
48            Normalizer2Impl nfcImpl = Norm2AllModes.getNFCInstance().impl;
49            ownedData = new CollationData(nfcImpl);
50        }
51        data = ownedData;
52    }
53
54    /** Not thread-safe, call only before sharing. */
55    void setRules(String r) {
56        assert rules == null && rulesResource == null;
57        rules = r;
58    }
59    /** Not thread-safe, call only before sharing. */
60    void setRulesResource(UResourceBundle res) {
61        assert rules == null && rulesResource == null;
62        rulesResource = res;
63    }
64    public String getRules() {
65        if (rules != null) {
66            return rules;
67        }
68        if (rulesResource != null) {
69            return rulesResource.getString();
70        }
71        return "";
72    }
73
74    static VersionInfo makeBaseVersion(VersionInfo ucaVersion) {
75        return VersionInfo.getInstance(
76                VersionInfo.UCOL_BUILDER_VERSION.getMajor(),
77                (ucaVersion.getMajor() << 3) + ucaVersion.getMinor(),
78                ucaVersion.getMilli() << 6,
79                0);
80    }
81    void setVersion(int baseVersion, int rulesVersion) {
82        // See comments for version field.
83        int r = (rulesVersion >> 16) & 0xff00;
84        int s = (rulesVersion >> 16) & 0xff;
85        int t = (rulesVersion >> 8) & 0xff;
86        int q = rulesVersion & 0xff;
87        version = (VersionInfo.UCOL_BUILDER_VERSION.getMajor() << 24) |
88                (baseVersion & 0xffc000) |  // UCA version u.v.w
89                ((r + (r >> 6)) & 0x3f00) |
90                (((s << 3) + (s >> 5) + t + (q << 4) + (q >> 4)) & 0xff);
91    }
92    int getUCAVersion() {
93        // Version second byte/bits 23..16 to bits 11..4,
94        // third byte/bits 15..14 to bits 1..0.
95        return ((version >> 12) & 0xff0) | ((version >> 14) & 3);
96    }
97
98    // data for sorting etc.
99    public CollationData data;  // == base data or ownedData
100    public SharedObject.Reference<CollationSettings> settings;  // reference-counted
101    // In Java, deserialize the rules string from the resource bundle
102    // only when it is used. (It can be large and is rarely used.)
103    private String rules;
104    private UResourceBundle rulesResource;
105    // The locale is null (C++: bogus) when built from rules or constructed from a binary blob.
106    // It can then be set by the service registration code which is thread-safe.
107    public ULocale actualLocale = ULocale.ROOT;
108    // UCA version u.v.w & rules version r.s.t.q:
109    // version[0]: builder version (runtime version is mixed in at runtime)
110    // version[1]: bits 7..3=u, bits 2..0=v
111    // version[2]: bits 7..6=w, bits 5..0=r
112    // version[3]= (s<<5)+(s>>3)+t+(q<<4)+(q>>4)
113    public int version = 0;
114
115    // owned objects
116    CollationData ownedData;
117    Trie2_32 trie;
118    UnicodeSet unsafeBackwardSet;
119    public Map<Integer, Integer> maxExpansions;
120
121    /*
122     * Not Cloneable: A CollationTailoring cannot be copied.
123     * It is immutable, and the data trie cannot be copied either.
124     */
125}
126