blob: b1db1019243f5578d7b5800c7f5a7ec6c96a2cca [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2013-2014, 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.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);
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;
}
static VersionInfo makeBaseVersion(VersionInfo ucaVersion) {
return VersionInfo.getInstance(
VersionInfo.UCOL_BUILDER_VERSION.getMajor(),
(ucaVersion.getMajor() << 3) + ucaVersion.getMinor(),
ucaVersion.getMilli() << 6,
0);
}
void setVersion(VersionInfo baseVersion, VersionInfo rulesVersion) {
version = VersionInfo.getInstance(
VersionInfo.UCOL_BUILDER_VERSION.getMajor(),
baseVersion.getMinor(),
(baseVersion.getMilli() & 0xc0) + ((rulesVersion.getMajor() + (rulesVersion.getMajor() >> 6)) & 0x3f),
(rulesVersion.getMinor() << 3) + (rulesVersion.getMinor() >> 5) + rulesVersion.getMilli() +
(rulesVersion.getMicro() << 4) + (rulesVersion.getMicro() >> 4));
}
int getUCAVersion() {
return (version.getMinor() << 4) | (version.getMilli() >> 6);
}
// data for sorting etc.
public CollationData data; // == base data or ownedData
public SharedObject.Reference<CollationSettings> settings; // reference-counted
public String rules = "";
// 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 VersionInfo version = ZERO_VERSION;
private static final VersionInfo ZERO_VERSION = VersionInfo.getInstance(0, 0, 0, 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.
*/
}