1*0e209d39SAndroid Build Coastguard Worker // © 2022 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker 4*0e209d39SAndroid Build Coastguard Worker #ifndef __DISPLAYOPTIONS_H__ 5*0e209d39SAndroid Build Coastguard Worker #define __DISPLAYOPTIONS_H__ 6*0e209d39SAndroid Build Coastguard Worker 7*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 8*0e209d39SAndroid Build Coastguard Worker 9*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 10*0e209d39SAndroid Build Coastguard Worker 11*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 12*0e209d39SAndroid Build Coastguard Worker 13*0e209d39SAndroid Build Coastguard Worker /** 14*0e209d39SAndroid Build Coastguard Worker * \file 15*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: Display options class 16*0e209d39SAndroid Build Coastguard Worker * 17*0e209d39SAndroid Build Coastguard Worker * This class is designed as a more modern version of the UDisplayContext mechanism. 18*0e209d39SAndroid Build Coastguard Worker */ 19*0e209d39SAndroid Build Coastguard Worker 20*0e209d39SAndroid Build Coastguard Worker #include "unicode/udisplayoptions.h" 21*0e209d39SAndroid Build Coastguard Worker #include "unicode/uversion.h" 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker /** 26*0e209d39SAndroid Build Coastguard Worker * Represents all the display options that are supported by CLDR such as grammatical case, noun 27*0e209d39SAndroid Build Coastguard Worker * class, ... etc. It currently supports enums, but may be extended in the future to have other 28*0e209d39SAndroid Build Coastguard Worker * types of data. It replaces a DisplayContext[] as a method parameter. 29*0e209d39SAndroid Build Coastguard Worker * 30*0e209d39SAndroid Build Coastguard Worker * NOTE: This class is Immutable, and uses a Builder interface. 31*0e209d39SAndroid Build Coastguard Worker * 32*0e209d39SAndroid Build Coastguard Worker * For example: 33*0e209d39SAndroid Build Coastguard Worker * ``` 34*0e209d39SAndroid Build Coastguard Worker * DisplayOptions x = 35*0e209d39SAndroid Build Coastguard Worker * DisplayOptions::builder(). 36*0e209d39SAndroid Build Coastguard Worker * .setGrammaticalCase(UDISPOPT_GRAMMATICAL_CASE_DATIVE) 37*0e209d39SAndroid Build Coastguard Worker * .setPluralCategory(UDISPOPT_PLURAL_CATEGORY_FEW) 38*0e209d39SAndroid Build Coastguard Worker * .build(); 39*0e209d39SAndroid Build Coastguard Worker * ``` 40*0e209d39SAndroid Build Coastguard Worker * 41*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 42*0e209d39SAndroid Build Coastguard Worker */ 43*0e209d39SAndroid Build Coastguard Worker class U_I18N_API DisplayOptions { 44*0e209d39SAndroid Build Coastguard Worker public: 45*0e209d39SAndroid Build Coastguard Worker /** 46*0e209d39SAndroid Build Coastguard Worker * Responsible for building `DisplayOptions`. 47*0e209d39SAndroid Build Coastguard Worker * 48*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 49*0e209d39SAndroid Build Coastguard Worker */ 50*0e209d39SAndroid Build Coastguard Worker class U_I18N_API Builder { 51*0e209d39SAndroid Build Coastguard Worker public: 52*0e209d39SAndroid Build Coastguard Worker /** 53*0e209d39SAndroid Build Coastguard Worker * Sets the grammatical case. 54*0e209d39SAndroid Build Coastguard Worker * 55*0e209d39SAndroid Build Coastguard Worker * @param grammaticalCase The grammatical case. 56*0e209d39SAndroid Build Coastguard Worker * @return Builder 57*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 58*0e209d39SAndroid Build Coastguard Worker */ setGrammaticalCase(UDisplayOptionsGrammaticalCase grammaticalCase)59*0e209d39SAndroid Build Coastguard Worker Builder &setGrammaticalCase(UDisplayOptionsGrammaticalCase grammaticalCase) { 60*0e209d39SAndroid Build Coastguard Worker this->grammaticalCase = grammaticalCase; 61*0e209d39SAndroid Build Coastguard Worker return *this; 62*0e209d39SAndroid Build Coastguard Worker } 63*0e209d39SAndroid Build Coastguard Worker 64*0e209d39SAndroid Build Coastguard Worker /** 65*0e209d39SAndroid Build Coastguard Worker * Sets the noun class. 66*0e209d39SAndroid Build Coastguard Worker * 67*0e209d39SAndroid Build Coastguard Worker * @param nounClass The noun class. 68*0e209d39SAndroid Build Coastguard Worker * @return Builder 69*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 70*0e209d39SAndroid Build Coastguard Worker */ setNounClass(UDisplayOptionsNounClass nounClass)71*0e209d39SAndroid Build Coastguard Worker Builder &setNounClass(UDisplayOptionsNounClass nounClass) { 72*0e209d39SAndroid Build Coastguard Worker this->nounClass = nounClass; 73*0e209d39SAndroid Build Coastguard Worker return *this; 74*0e209d39SAndroid Build Coastguard Worker } 75*0e209d39SAndroid Build Coastguard Worker 76*0e209d39SAndroid Build Coastguard Worker /** 77*0e209d39SAndroid Build Coastguard Worker * Sets the plural category. 78*0e209d39SAndroid Build Coastguard Worker * 79*0e209d39SAndroid Build Coastguard Worker * @param pluralCategory The plural category. 80*0e209d39SAndroid Build Coastguard Worker * @return Builder 81*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 82*0e209d39SAndroid Build Coastguard Worker */ setPluralCategory(UDisplayOptionsPluralCategory pluralCategory)83*0e209d39SAndroid Build Coastguard Worker Builder &setPluralCategory(UDisplayOptionsPluralCategory pluralCategory) { 84*0e209d39SAndroid Build Coastguard Worker this->pluralCategory = pluralCategory; 85*0e209d39SAndroid Build Coastguard Worker return *this; 86*0e209d39SAndroid Build Coastguard Worker } 87*0e209d39SAndroid Build Coastguard Worker 88*0e209d39SAndroid Build Coastguard Worker /** 89*0e209d39SAndroid Build Coastguard Worker * Sets the capitalization. 90*0e209d39SAndroid Build Coastguard Worker * 91*0e209d39SAndroid Build Coastguard Worker * @param capitalization The capitalization. 92*0e209d39SAndroid Build Coastguard Worker * @return Builder 93*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 94*0e209d39SAndroid Build Coastguard Worker */ setCapitalization(UDisplayOptionsCapitalization capitalization)95*0e209d39SAndroid Build Coastguard Worker Builder &setCapitalization(UDisplayOptionsCapitalization capitalization) { 96*0e209d39SAndroid Build Coastguard Worker this->capitalization = capitalization; 97*0e209d39SAndroid Build Coastguard Worker return *this; 98*0e209d39SAndroid Build Coastguard Worker } 99*0e209d39SAndroid Build Coastguard Worker 100*0e209d39SAndroid Build Coastguard Worker /** 101*0e209d39SAndroid Build Coastguard Worker * Sets the dialect handling. 102*0e209d39SAndroid Build Coastguard Worker * 103*0e209d39SAndroid Build Coastguard Worker * @param nameStyle The name style. 104*0e209d39SAndroid Build Coastguard Worker * @return Builder 105*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 106*0e209d39SAndroid Build Coastguard Worker */ setNameStyle(UDisplayOptionsNameStyle nameStyle)107*0e209d39SAndroid Build Coastguard Worker Builder &setNameStyle(UDisplayOptionsNameStyle nameStyle) { 108*0e209d39SAndroid Build Coastguard Worker this->nameStyle = nameStyle; 109*0e209d39SAndroid Build Coastguard Worker return *this; 110*0e209d39SAndroid Build Coastguard Worker } 111*0e209d39SAndroid Build Coastguard Worker 112*0e209d39SAndroid Build Coastguard Worker /** 113*0e209d39SAndroid Build Coastguard Worker * Sets the display length. 114*0e209d39SAndroid Build Coastguard Worker * 115*0e209d39SAndroid Build Coastguard Worker * @param displayLength The display length. 116*0e209d39SAndroid Build Coastguard Worker * @return Builder 117*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 118*0e209d39SAndroid Build Coastguard Worker */ setDisplayLength(UDisplayOptionsDisplayLength displayLength)119*0e209d39SAndroid Build Coastguard Worker Builder &setDisplayLength(UDisplayOptionsDisplayLength displayLength) { 120*0e209d39SAndroid Build Coastguard Worker this->displayLength = displayLength; 121*0e209d39SAndroid Build Coastguard Worker return *this; 122*0e209d39SAndroid Build Coastguard Worker } 123*0e209d39SAndroid Build Coastguard Worker 124*0e209d39SAndroid Build Coastguard Worker /** 125*0e209d39SAndroid Build Coastguard Worker * Sets the substitute handling. 126*0e209d39SAndroid Build Coastguard Worker * 127*0e209d39SAndroid Build Coastguard Worker * @param substituteHandling The substitute handling. 128*0e209d39SAndroid Build Coastguard Worker * @return Builder 129*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 130*0e209d39SAndroid Build Coastguard Worker */ setSubstituteHandling(UDisplayOptionsSubstituteHandling substituteHandling)131*0e209d39SAndroid Build Coastguard Worker Builder &setSubstituteHandling(UDisplayOptionsSubstituteHandling substituteHandling) { 132*0e209d39SAndroid Build Coastguard Worker this->substituteHandling = substituteHandling; 133*0e209d39SAndroid Build Coastguard Worker return *this; 134*0e209d39SAndroid Build Coastguard Worker } 135*0e209d39SAndroid Build Coastguard Worker 136*0e209d39SAndroid Build Coastguard Worker /** 137*0e209d39SAndroid Build Coastguard Worker * Builds the display options. 138*0e209d39SAndroid Build Coastguard Worker * 139*0e209d39SAndroid Build Coastguard Worker * @return DisplayOptions 140*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 141*0e209d39SAndroid Build Coastguard Worker */ build()142*0e209d39SAndroid Build Coastguard Worker DisplayOptions build() { return DisplayOptions(*this); } 143*0e209d39SAndroid Build Coastguard Worker 144*0e209d39SAndroid Build Coastguard Worker private: 145*0e209d39SAndroid Build Coastguard Worker friend DisplayOptions; 146*0e209d39SAndroid Build Coastguard Worker 147*0e209d39SAndroid Build Coastguard Worker Builder(); 148*0e209d39SAndroid Build Coastguard Worker Builder(const DisplayOptions &displayOptions); 149*0e209d39SAndroid Build Coastguard Worker 150*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsGrammaticalCase grammaticalCase; 151*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsNounClass nounClass; 152*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsPluralCategory pluralCategory; 153*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsCapitalization capitalization; 154*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsNameStyle nameStyle; 155*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsDisplayLength displayLength; 156*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsSubstituteHandling substituteHandling; 157*0e209d39SAndroid Build Coastguard Worker }; 158*0e209d39SAndroid Build Coastguard Worker 159*0e209d39SAndroid Build Coastguard Worker /** 160*0e209d39SAndroid Build Coastguard Worker * Creates a builder with the `UNDEFINED` values for all the parameters. 161*0e209d39SAndroid Build Coastguard Worker * 162*0e209d39SAndroid Build Coastguard Worker * @return Builder 163*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 164*0e209d39SAndroid Build Coastguard Worker */ 165*0e209d39SAndroid Build Coastguard Worker static Builder builder(); 166*0e209d39SAndroid Build Coastguard Worker /** 167*0e209d39SAndroid Build Coastguard Worker * Creates a builder with the same parameters from this object. 168*0e209d39SAndroid Build Coastguard Worker * 169*0e209d39SAndroid Build Coastguard Worker * @return Builder 170*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 171*0e209d39SAndroid Build Coastguard Worker */ 172*0e209d39SAndroid Build Coastguard Worker Builder copyToBuilder() const; 173*0e209d39SAndroid Build Coastguard Worker /** 174*0e209d39SAndroid Build Coastguard Worker * Gets the grammatical case. 175*0e209d39SAndroid Build Coastguard Worker * 176*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsGrammaticalCase 177*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 178*0e209d39SAndroid Build Coastguard Worker */ getGrammaticalCase()179*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsGrammaticalCase getGrammaticalCase() const { return grammaticalCase; } 180*0e209d39SAndroid Build Coastguard Worker 181*0e209d39SAndroid Build Coastguard Worker /** 182*0e209d39SAndroid Build Coastguard Worker * Gets the noun class. 183*0e209d39SAndroid Build Coastguard Worker * 184*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsNounClass 185*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 186*0e209d39SAndroid Build Coastguard Worker */ getNounClass()187*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsNounClass getNounClass() const { return nounClass; } 188*0e209d39SAndroid Build Coastguard Worker 189*0e209d39SAndroid Build Coastguard Worker /** 190*0e209d39SAndroid Build Coastguard Worker * Gets the plural category. 191*0e209d39SAndroid Build Coastguard Worker * 192*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsPluralCategory 193*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 194*0e209d39SAndroid Build Coastguard Worker */ getPluralCategory()195*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsPluralCategory getPluralCategory() const { return pluralCategory; } 196*0e209d39SAndroid Build Coastguard Worker 197*0e209d39SAndroid Build Coastguard Worker /** 198*0e209d39SAndroid Build Coastguard Worker * Gets the capitalization. 199*0e209d39SAndroid Build Coastguard Worker * 200*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsCapitalization 201*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 202*0e209d39SAndroid Build Coastguard Worker */ getCapitalization()203*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsCapitalization getCapitalization() const { return capitalization; } 204*0e209d39SAndroid Build Coastguard Worker 205*0e209d39SAndroid Build Coastguard Worker /** 206*0e209d39SAndroid Build Coastguard Worker * Gets the dialect handling. 207*0e209d39SAndroid Build Coastguard Worker * 208*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsNameStyle 209*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 210*0e209d39SAndroid Build Coastguard Worker */ getNameStyle()211*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsNameStyle getNameStyle() const { return nameStyle; } 212*0e209d39SAndroid Build Coastguard Worker 213*0e209d39SAndroid Build Coastguard Worker /** 214*0e209d39SAndroid Build Coastguard Worker * Gets the display length. 215*0e209d39SAndroid Build Coastguard Worker * 216*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsDisplayLength 217*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 218*0e209d39SAndroid Build Coastguard Worker */ getDisplayLength()219*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsDisplayLength getDisplayLength() const { return displayLength; } 220*0e209d39SAndroid Build Coastguard Worker 221*0e209d39SAndroid Build Coastguard Worker /** 222*0e209d39SAndroid Build Coastguard Worker * Gets the substitute handling. 223*0e209d39SAndroid Build Coastguard Worker * 224*0e209d39SAndroid Build Coastguard Worker * @return UDisplayOptionsSubstituteHandling 225*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 226*0e209d39SAndroid Build Coastguard Worker */ getSubstituteHandling()227*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsSubstituteHandling getSubstituteHandling() const { return substituteHandling; } 228*0e209d39SAndroid Build Coastguard Worker 229*0e209d39SAndroid Build Coastguard Worker /** 230*0e209d39SAndroid Build Coastguard Worker * Copies the DisplayOptions. 231*0e209d39SAndroid Build Coastguard Worker * 232*0e209d39SAndroid Build Coastguard Worker * @param other The options to copy. 233*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 234*0e209d39SAndroid Build Coastguard Worker */ 235*0e209d39SAndroid Build Coastguard Worker DisplayOptions &operator=(const DisplayOptions &other) = default; 236*0e209d39SAndroid Build Coastguard Worker 237*0e209d39SAndroid Build Coastguard Worker /** 238*0e209d39SAndroid Build Coastguard Worker * Moves the DisplayOptions. 239*0e209d39SAndroid Build Coastguard Worker * 240*0e209d39SAndroid Build Coastguard Worker * @param other The options to move from. 241*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 242*0e209d39SAndroid Build Coastguard Worker */ 243*0e209d39SAndroid Build Coastguard Worker DisplayOptions &operator=(DisplayOptions &&other) noexcept = default; 244*0e209d39SAndroid Build Coastguard Worker 245*0e209d39SAndroid Build Coastguard Worker /** 246*0e209d39SAndroid Build Coastguard Worker * Copies the DisplayOptions. 247*0e209d39SAndroid Build Coastguard Worker * 248*0e209d39SAndroid Build Coastguard Worker * @param other The options to copy. 249*0e209d39SAndroid Build Coastguard Worker * @stable ICU 72 250*0e209d39SAndroid Build Coastguard Worker */ 251*0e209d39SAndroid Build Coastguard Worker DisplayOptions(const DisplayOptions &other) = default; 252*0e209d39SAndroid Build Coastguard Worker 253*0e209d39SAndroid Build Coastguard Worker private: 254*0e209d39SAndroid Build Coastguard Worker DisplayOptions(const Builder &builder); 255*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsGrammaticalCase grammaticalCase; 256*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsNounClass nounClass; 257*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsPluralCategory pluralCategory; 258*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsCapitalization capitalization; 259*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsNameStyle nameStyle; 260*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsDisplayLength displayLength; 261*0e209d39SAndroid Build Coastguard Worker UDisplayOptionsSubstituteHandling substituteHandling; 262*0e209d39SAndroid Build Coastguard Worker }; 263*0e209d39SAndroid Build Coastguard Worker 264*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 265*0e209d39SAndroid Build Coastguard Worker 266*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 267*0e209d39SAndroid Build Coastguard Worker 268*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */ 269*0e209d39SAndroid Build Coastguard Worker 270*0e209d39SAndroid Build Coastguard Worker #endif // __DISPLAYOPTIONS_H__ 271