OLD | NEW |
1 /* | 1 /* |
2 ******************************************************************************* | 2 ******************************************************************************* |
3 * Copyright (C) 2007-2013, International Business Machines Corporation and | 3 * Copyright (C) 2007-2014, International Business Machines Corporation and |
4 * others. All Rights Reserved. | 4 * others. All Rights Reserved. |
5 ******************************************************************************* | 5 ******************************************************************************* |
6 * | 6 * |
7 * File plurrule.cpp | 7 * File plurrule.cpp |
8 */ | 8 */ |
9 | 9 |
10 #include <math.h> | 10 #include <math.h> |
11 #include <stdio.h> | 11 #include <stdio.h> |
12 | 12 |
13 #include "unicode/utypes.h" | 13 #include "unicode/utypes.h" |
14 #include "unicode/localpointer.h" | 14 #include "unicode/localpointer.h" |
15 #include "unicode/plurrule.h" | 15 #include "unicode/plurrule.h" |
16 #include "unicode/upluralrules.h" | 16 #include "unicode/upluralrules.h" |
17 #include "unicode/ures.h" | 17 #include "unicode/ures.h" |
18 #include "charstr.h" | 18 #include "charstr.h" |
19 #include "cmemory.h" | 19 #include "cmemory.h" |
20 #include "cstring.h" | 20 #include "cstring.h" |
21 #include "digitlst.h" | 21 #include "digitlst.h" |
22 #include "hash.h" | 22 #include "hash.h" |
23 #include "locutil.h" | 23 #include "locutil.h" |
24 #include "mutex.h" | 24 #include "mutex.h" |
25 #include "patternprops.h" | 25 #include "patternprops.h" |
26 #include "plurrule_impl.h" | 26 #include "plurrule_impl.h" |
27 #include "putilimp.h" | 27 #include "putilimp.h" |
28 #include "ucln_in.h" | 28 #include "ucln_in.h" |
29 #include "ustrfmt.h" | 29 #include "ustrfmt.h" |
30 #include "uassert.h" | 30 #include "uassert.h" |
31 #include "uvectr32.h" | 31 #include "uvectr32.h" |
| 32 #include "sharedpluralrules.h" |
| 33 #include "unifiedcache.h" |
32 | 34 |
33 #if !UCONFIG_NO_FORMATTING | 35 #if !UCONFIG_NO_FORMATTING |
34 | 36 |
35 U_NAMESPACE_BEGIN | 37 U_NAMESPACE_BEGIN |
36 | 38 |
37 #define ARRAY_SIZE(array) (int32_t)(sizeof array / sizeof array[0]) | 39 #define ARRAY_SIZE(array) (int32_t)(sizeof array / sizeof array[0]) |
38 | 40 |
39 static const UChar PLURAL_KEYWORD_OTHER[]={LOW_O,LOW_T,LOW_H,LOW_E,LOW_R,0}; | 41 static const UChar PLURAL_KEYWORD_OTHER[]={LOW_O,LOW_T,LOW_H,LOW_E,LOW_R,0}; |
40 static const UChar PLURAL_DEFAULT_RULE[]={LOW_O,LOW_T,LOW_H,LOW_E,LOW_R,COLON,SP
ACE,LOW_N,0}; | 42 static const UChar PLURAL_DEFAULT_RULE[]={LOW_O,LOW_T,LOW_H,LOW_E,LOW_R,COLON,SP
ACE,LOW_N,0}; |
41 static const UChar PK_IN[]={LOW_I,LOW_N,0}; | 43 static const UChar PK_IN[]={LOW_I,LOW_N,0}; |
42 static const UChar PK_NOT[]={LOW_N,LOW_O,LOW_T,0}; | 44 static const UChar PK_NOT[]={LOW_N,LOW_O,LOW_T,0}; |
43 static const UChar PK_IS[]={LOW_I,LOW_S,0}; | 45 static const UChar PK_IS[]={LOW_I,LOW_S,0}; |
44 static const UChar PK_MOD[]={LOW_M,LOW_O,LOW_D,0}; | 46 static const UChar PK_MOD[]={LOW_M,LOW_O,LOW_D,0}; |
45 static const UChar PK_AND[]={LOW_A,LOW_N,LOW_D,0}; | 47 static const UChar PK_AND[]={LOW_A,LOW_N,LOW_D,0}; |
46 static const UChar PK_OR[]={LOW_O,LOW_R,0}; | 48 static const UChar PK_OR[]={LOW_O,LOW_R,0}; |
47 static const UChar PK_VAR_N[]={LOW_N,0}; | 49 static const UChar PK_VAR_N[]={LOW_N,0}; |
48 static const UChar PK_VAR_I[]={LOW_I,0}; | 50 static const UChar PK_VAR_I[]={LOW_I,0}; |
49 static const UChar PK_VAR_F[]={LOW_F,0}; | 51 static const UChar PK_VAR_F[]={LOW_F,0}; |
50 static const UChar PK_VAR_T[]={LOW_T,0}; | 52 static const UChar PK_VAR_T[]={LOW_T,0}; |
51 static const UChar PK_VAR_V[]={LOW_V,0}; | 53 static const UChar PK_VAR_V[]={LOW_V,0}; |
52 static const UChar PK_VAR_J[]={LOW_J,0}; | |
53 static const UChar PK_WITHIN[]={LOW_W,LOW_I,LOW_T,LOW_H,LOW_I,LOW_N,0}; | 54 static const UChar PK_WITHIN[]={LOW_W,LOW_I,LOW_T,LOW_H,LOW_I,LOW_N,0}; |
54 static const UChar PK_DECIMAL[]={LOW_D,LOW_E,LOW_C,LOW_I,LOW_M,LOW_A,LOW_L,0}; | 55 static const UChar PK_DECIMAL[]={LOW_D,LOW_E,LOW_C,LOW_I,LOW_M,LOW_A,LOW_L,0}; |
55 static const UChar PK_INTEGER[]={LOW_I,LOW_N,LOW_T,LOW_E,LOW_G,LOW_E,LOW_R,0}; | 56 static const UChar PK_INTEGER[]={LOW_I,LOW_N,LOW_T,LOW_E,LOW_G,LOW_E,LOW_R,0}; |
56 | 57 |
57 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(PluralRules) | 58 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(PluralRules) |
58 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(PluralKeywordEnumeration) | 59 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(PluralKeywordEnumeration) |
59 | 60 |
60 PluralRules::PluralRules(UErrorCode& /*status*/) | 61 PluralRules::PluralRules(UErrorCode& /*status*/) |
61 : UObject(), | 62 : UObject(), |
62 mRules(NULL) | 63 mRules(NULL) |
63 { | 64 { |
64 } | 65 } |
65 | 66 |
66 PluralRules::PluralRules(const PluralRules& other) | 67 PluralRules::PluralRules(const PluralRules& other) |
67 : UObject(other), | 68 : UObject(other), |
68 mRules(NULL) | 69 mRules(NULL) |
69 { | 70 { |
70 *this=other; | 71 *this=other; |
71 } | 72 } |
72 | 73 |
73 PluralRules::~PluralRules() { | 74 PluralRules::~PluralRules() { |
74 delete mRules; | 75 delete mRules; |
75 } | 76 } |
76 | 77 |
| 78 SharedPluralRules::~SharedPluralRules() { |
| 79 delete ptr; |
| 80 } |
| 81 |
77 PluralRules* | 82 PluralRules* |
78 PluralRules::clone() const { | 83 PluralRules::clone() const { |
79 return new PluralRules(*this); | 84 return new PluralRules(*this); |
80 } | 85 } |
81 | 86 |
82 PluralRules& | 87 PluralRules& |
83 PluralRules::operator=(const PluralRules& other) { | 88 PluralRules::operator=(const PluralRules& other) { |
84 if (this != &other) { | 89 if (this != &other) { |
85 delete mRules; | 90 delete mRules; |
86 if (other.mRules==NULL) { | 91 if (other.mRules==NULL) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 } | 130 } |
126 return newRules; | 131 return newRules; |
127 } | 132 } |
128 | 133 |
129 | 134 |
130 PluralRules* U_EXPORT2 | 135 PluralRules* U_EXPORT2 |
131 PluralRules::createDefaultRules(UErrorCode& status) { | 136 PluralRules::createDefaultRules(UErrorCode& status) { |
132 return createRules(UnicodeString(TRUE, PLURAL_DEFAULT_RULE, -1), status); | 137 return createRules(UnicodeString(TRUE, PLURAL_DEFAULT_RULE, -1), status); |
133 } | 138 } |
134 | 139 |
| 140 /******************************************************************************/ |
| 141 /* Create PluralRules cache */ |
| 142 |
| 143 template<> U_I18N_API |
| 144 const SharedPluralRules *LocaleCacheKey<SharedPluralRules>::createObject( |
| 145 const void * /*unused*/, UErrorCode &status) const { |
| 146 const char *localeId = fLoc.getName(); |
| 147 PluralRules *pr = PluralRules::internalForLocale( |
| 148 localeId, UPLURAL_TYPE_CARDINAL, status); |
| 149 if (U_FAILURE(status)) { |
| 150 return NULL; |
| 151 } |
| 152 SharedPluralRules *result = new SharedPluralRules(pr); |
| 153 if (result == NULL) { |
| 154 status = U_MEMORY_ALLOCATION_ERROR; |
| 155 delete pr; |
| 156 return NULL; |
| 157 } |
| 158 result->addRef(); |
| 159 return result; |
| 160 } |
| 161 |
| 162 /* end plural rules cache */ |
| 163 /******************************************************************************/ |
| 164 |
| 165 const SharedPluralRules* U_EXPORT2 |
| 166 PluralRules::createSharedInstance( |
| 167 const Locale& locale, UPluralType type, UErrorCode& status) { |
| 168 if (U_FAILURE(status)) { |
| 169 return NULL; |
| 170 } |
| 171 if (type != UPLURAL_TYPE_CARDINAL) { |
| 172 status = U_UNSUPPORTED_ERROR; |
| 173 return NULL; |
| 174 } |
| 175 const SharedPluralRules *result = NULL; |
| 176 UnifiedCache::getByLocale(locale, result, status); |
| 177 return result; |
| 178 } |
| 179 |
135 PluralRules* U_EXPORT2 | 180 PluralRules* U_EXPORT2 |
136 PluralRules::forLocale(const Locale& locale, UErrorCode& status) { | 181 PluralRules::forLocale(const Locale& locale, UErrorCode& status) { |
137 return forLocale(locale, UPLURAL_TYPE_CARDINAL, status); | 182 return forLocale(locale, UPLURAL_TYPE_CARDINAL, status); |
138 } | 183 } |
139 | 184 |
140 PluralRules* U_EXPORT2 | 185 PluralRules* U_EXPORT2 |
141 PluralRules::forLocale(const Locale& locale, UPluralType type, UErrorCode& statu
s) { | 186 PluralRules::forLocale(const Locale& locale, UPluralType type, UErrorCode& statu
s) { |
| 187 if (type != UPLURAL_TYPE_CARDINAL) { |
| 188 return internalForLocale(locale, type, status); |
| 189 } |
| 190 const SharedPluralRules *shared = createSharedInstance( |
| 191 locale, type, status); |
142 if (U_FAILURE(status)) { | 192 if (U_FAILURE(status)) { |
143 return NULL; | 193 return NULL; |
144 } | 194 } |
| 195 PluralRules *result = (*shared)->clone(); |
| 196 shared->removeRef(); |
| 197 if (result == NULL) { |
| 198 status = U_MEMORY_ALLOCATION_ERROR; |
| 199 } |
| 200 return result; |
| 201 } |
| 202 |
| 203 PluralRules* U_EXPORT2 |
| 204 PluralRules::internalForLocale(const Locale& locale, UPluralType type, UErrorCod
e& status) { |
| 205 if (U_FAILURE(status)) { |
| 206 return NULL; |
| 207 } |
145 if (type >= UPLURAL_TYPE_COUNT) { | 208 if (type >= UPLURAL_TYPE_COUNT) { |
146 status = U_ILLEGAL_ARGUMENT_ERROR; | 209 status = U_ILLEGAL_ARGUMENT_ERROR; |
147 return NULL; | 210 return NULL; |
148 } | 211 } |
149 PluralRules *newObj = new PluralRules(status); | 212 PluralRules *newObj = new PluralRules(status); |
150 if (newObj==NULL || U_FAILURE(status)) { | 213 if (newObj==NULL || U_FAILURE(status)) { |
151 delete newObj; | 214 delete newObj; |
152 return NULL; | 215 return NULL; |
153 } | 216 } |
154 UnicodeString locRule = newObj->getRuleFromResource(locale, type, status); | 217 UnicodeString locRule = newObj->getRuleFromResource(locale, type, status); |
(...skipping 1432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1587 } | 1650 } |
1588 return ures_getSize(fLocales); | 1651 return ures_getSize(fLocales); |
1589 } | 1652 } |
1590 | 1653 |
1591 U_NAMESPACE_END | 1654 U_NAMESPACE_END |
1592 | 1655 |
1593 | 1656 |
1594 #endif /* #if !UCONFIG_NO_FORMATTING */ | 1657 #endif /* #if !UCONFIG_NO_FORMATTING */ |
1595 | 1658 |
1596 //eof | 1659 //eof |
OLD | NEW |