164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/*
4fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*******************************************************************************
5fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 2013-2014, International Business Machines
6fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Corporation and others.  All Rights Reserved.
7fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*******************************************************************************
8fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* collationtailoring.h
9fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*
10fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* created on: 2013mar12
11fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* created by: Markus W. Scherer
12fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*/
13fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
14fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#ifndef __COLLATIONTAILORING_H__
15fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#define __COLLATIONTAILORING_H__
16fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
17fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/utypes.h"
18fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
19fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_COLLATION
20fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
21fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/locid.h"
22fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/unistr.h"
23fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/uversion.h"
24fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "collationsettings.h"
25fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "uhash.h"
26fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "umutex.h"
27fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
28fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct UDataMemory;
29fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct UResourceBundle;
30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct UTrie2;
31fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
32fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_BEGIN
33fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
34fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct CollationData;
35fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
36fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusclass UnicodeSet;
37fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
38fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/**
39fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Collation tailoring data & settings.
40fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * This is a container of values for a collation tailoring
41fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * built from rules or deserialized from binary data.
42fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *
43fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * It is logically immutable: Do not modify its values.
44fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * The fields are public for convenience.
45fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *
46fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * It is shared, reference-counted, and auto-deleted; see SharedObject.
47fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius */
48fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct U_I18N_API CollationTailoring : public SharedObject {
49fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationTailoring(const CollationSettings *baseSettings);
50fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    virtual ~CollationTailoring();
51fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
52fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
53fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Returns TRUE if the constructor could not initialize properly.
54fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
55fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UBool isBogus() { return settings == NULL; }
56fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
57fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UBool ensureOwnedData(UErrorCode &errorCode);
58fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
59fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static void makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version);
60fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion);
61fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t getUCAVersion() const;
62fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
63fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // data for sorting etc.
64fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const CollationData *data;  // == base data or ownedData
65fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const CollationSettings *settings;  // reference-counted
66fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString rules;
67fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // The locale is bogus when built from rules or constructed from a binary blob.
68fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // It can then be set by the service registration code which is thread-safe.
69fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    mutable Locale actualLocale;
70fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // UCA version u.v.w & rules version r.s.t.q:
71fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // version[0]: builder version (runtime version is mixed in at runtime)
72fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // version[1]: bits 7..3=u, bits 2..0=v
73fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // version[2]: bits 7..6=w, bits 5..0=r
74fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // version[3]= (s<<5)+(s>>3)+t+(q<<4)+(q>>4)
75fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UVersionInfo version;
76fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
77fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // owned objects
78fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationData *ownedData;
79fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UObject *builder;
80fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UDataMemory *memory;
81fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UResourceBundle *bundle;
82fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UTrie2 *trie;
83fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeSet *unsafeBackwardSet;
84fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    mutable UHashtable *maxExpansions;
85fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    mutable UInitOnce maxExpansionsInitOnce;
86fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
87fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusprivate:
88fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
89fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * No copy constructor: A CollationTailoring cannot be copied.
90fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * It is immutable, and the data trie cannot be copied either.
91fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
92fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationTailoring(const CollationTailoring &other);
93fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius};
94fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
95f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstruct CollationCacheEntry : public SharedObject {
96f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    CollationCacheEntry(const Locale &loc, const CollationTailoring *t)
97f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            : validLocale(loc), tailoring(t) {
98f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if(t != NULL) {
99f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            t->addRef();
100f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
101f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
102f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    ~CollationCacheEntry();
103f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
104f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    Locale validLocale;
105f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    const CollationTailoring *tailoring;
106f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius};
107f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
108fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END
109fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
110fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif  // !UCONFIG_NO_COLLATION
111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif  // __COLLATIONTAILORING_H__
112