blob: b46b5194e3bf7bd091aa241f6d5dfa232abc538c [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2013-2015, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* CollationTailoring.java, ported from collationtailoring.h/.cpp
*
* C++ version created on: 2013mar12
* created by: Markus W. Scherer
*/
package com.ibm.icu.impl.coll;
import java.util.Map;
import com.ibm.icu.impl.Norm2AllModes;
import com.ibm.icu.impl.Normalizer2Impl;
import com.ibm.icu.impl.Trie2_32;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.UResourceBundle;
import com.ibm.icu.util.VersionInfo;
/**
* Collation tailoring data & settings.
* This is a container of values for a collation tailoring
* built from rules or deserialized from binary data.
*
* It is logically immutable: Do not modify its values.
* The fields are public for convenience.
*/
public final class CollationTailoring {
CollationTailoring(SharedObject.Reference<CollationSettings> baseSettings) {
if(baseSettings != null) {
assert(baseSettings.readOnly().reorderCodes.length == 0);
assert(baseSettings.readOnly().reorderTable == null);
assert(baseSettings.readOnly().minHighNoReorder == 0);
settings = baseSettings.clone();
} else {
settings = new SharedObject.Reference<CollationSettings>(new CollationSettings());
}
}
void ensureOwnedData() {
if(ownedData == null) {
Normalizer2Impl nfcImpl = Norm2AllModes.getNFCInstance().impl;
ownedData = new CollationData(nfcImpl);
}
data = ownedData;
}
/** Not thread-safe, call only before sharing. */
void setRules(String r) {
assert rules == null && rulesResource == null;
rules = r;
}
/** Not thread-safe, call only before sharing. */
void setRulesResource(UResourceBundle res) {
assert rules == null && rulesResource == null;
rulesResource = res;
}
public String getRules() {
if (rules != null) {
return rules;
}
if (rulesResource != null) {
return rulesResource.getString();
}
return "";
}
static VersionInfo makeBaseVersion(VersionInfo ucaVersion) {
return VersionInfo.getInstance(
VersionInfo.UCOL_BUILDER_VERSION.getMajor(),
(ucaVersion.getMajor() << 3) + ucaVersion.getMinor(),
ucaVersion.getMilli() << 6,
0);
}
void setVersion(int baseVersion, int rulesVersion) {
// See comments for version field.
int r = (rulesVersion >> 16) & 0xff00;
int s = (rulesVersion >> 16) & 0xff;
int t = (rulesVersion >> 8) & 0xff;
int q = rulesVersion & 0xff;
version = (VersionInfo.UCOL_BUILDER_VERSION.getMajor() << 24) |
(baseVersion & 0xffc000) | // UCA version u.v.w
((r + (r >> 6)) & 0x3f00) |
(((s << 3) + (s >> 5) + t + (q << 4) + (q >> 4)) & 0xff);
}
int getUCAVersion() {
// Version second byte/bits 23..16 to bits 11..4,
// third byte/bits 15..14 to bits 1..0.
return ((version >> 12) & 0xff0) | ((version >> 14) & 3);
}
// data for sorting etc.
public CollationData data; // == base data or ownedData
public SharedObject.Reference<CollationSettings> settings; // reference-counted
// In Java, deserialize the rules string from the resource bundle
// only when it is used. (It can be large and is rarely used.)
private String rules;
private UResourceBundle rulesResource;
// The locale is null (C++: bogus) when built from rules or constructed from a binary blob.
// It can then be set by the service registration code which is thread-safe.
public ULocale actualLocale = ULocale.ROOT;
// UCA version u.v.w & rules version r.s.t.q:
// version[0]: builder version (runtime version is mixed in at runtime)
// version[1]: bits 7..3=u, bits 2..0=v
// version[2]: bits 7..6=w, bits 5..0=r
// version[3]= (s<<5)+(s>>3)+t+(q<<4)+(q>>4)
public int version = 0;
// owned objects
CollationData ownedData;
Trie2_32 trie;
UnicodeSet unsafeBackwardSet;
public Map<Integer, Integer> maxExpansions;
/*
* Not Cloneable: A CollationTailoring cannot be copied.
* It is immutable, and the data trie cannot be copied either.
*/
}