00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef PLURFMT
00015 #define PLURFMT
00016
00017 #include "unicode/utypes.h"
00018
00019 #if U_SHOW_CPLUSPLUS_API
00020
00026 #if !UCONFIG_NO_FORMATTING
00027
00028 #include "unicode/messagepattern.h"
00029 #include "unicode/numfmt.h"
00030 #include "unicode/plurrule.h"
00031
00032 U_NAMESPACE_BEGIN
00033
00034 class Hashtable;
00035 class NFRule;
00036
00148 class U_I18N_API PluralFormat : public Format {
00149 public:
00150
00159 PluralFormat(UErrorCode& status);
00160
00170 PluralFormat(const Locale& locale, UErrorCode& status);
00171
00181 PluralFormat(const PluralRules& rules, UErrorCode& status);
00182
00199 PluralFormat(const Locale& locale, const PluralRules& rules, UErrorCode& status);
00200
00211 PluralFormat(const Locale& locale, UPluralType type, UErrorCode& status);
00212
00223 PluralFormat(const UnicodeString& pattern, UErrorCode& status);
00224
00239 PluralFormat(const Locale& locale, const UnicodeString& pattern, UErrorCode& status);
00240
00252 PluralFormat(const PluralRules& rules,
00253 const UnicodeString& pattern,
00254 UErrorCode& status);
00255
00270 PluralFormat(const Locale& locale,
00271 const PluralRules& rules,
00272 const UnicodeString& pattern,
00273 UErrorCode& status);
00274
00288 PluralFormat(const Locale& locale,
00289 UPluralType type,
00290 const UnicodeString& pattern,
00291 UErrorCode& status);
00292
00297 PluralFormat(const PluralFormat& other);
00298
00303 virtual ~PluralFormat();
00304
00317 void applyPattern(const UnicodeString& pattern, UErrorCode& status);
00318
00319
00320 using Format::format;
00321
00334 UnicodeString format(int32_t number, UErrorCode& status) const;
00335
00348 UnicodeString format(double number, UErrorCode& status) const;
00349
00366 UnicodeString& format(int32_t number,
00367 UnicodeString& appendTo,
00368 FieldPosition& pos,
00369 UErrorCode& status) const;
00370
00387 UnicodeString& format(double number,
00388 UnicodeString& appendTo,
00389 FieldPosition& pos,
00390 UErrorCode& status) const;
00391
00392 #ifndef U_HIDE_DEPRECATED_API
00393
00408 void setLocale(const Locale& locale, UErrorCode& status);
00409 #endif
00410
00420 void setNumberFormat(const NumberFormat* format, UErrorCode& status);
00421
00428 PluralFormat& operator=(const PluralFormat& other);
00429
00437 virtual UBool operator==(const Format& other) const;
00438
00446 virtual UBool operator!=(const Format& other) const;
00447
00453 virtual PluralFormat* clone() const;
00454
00469 UnicodeString& format(const Formattable& obj,
00470 UnicodeString& appendTo,
00471 FieldPosition& pos,
00472 UErrorCode& status) const;
00473
00482 UnicodeString& toPattern(UnicodeString& appendTo);
00483
00506 virtual void parseObject(const UnicodeString& source,
00507 Formattable& result,
00508 ParsePosition& parse_pos) const;
00509
00516 static UClassID U_EXPORT2 getStaticClassID(void);
00517
00523 virtual UClassID getDynamicClassID() const;
00524
00525 private:
00529 class U_I18N_API PluralSelector : public UMemory {
00530 public:
00531 virtual ~PluralSelector();
00541 virtual UnicodeString select(void *context, double number, UErrorCode& ec) const = 0;
00542 };
00543
00544 class U_I18N_API PluralSelectorAdapter : public PluralSelector {
00545 public:
00546 PluralSelectorAdapter() : pluralRules(NULL) {
00547 }
00548
00549 virtual ~PluralSelectorAdapter();
00550
00551 virtual UnicodeString select(void *context, double number, UErrorCode& ) const;
00552
00553 void reset();
00554
00555 PluralRules* pluralRules;
00556 };
00557
00558 Locale locale;
00559 MessagePattern msgPattern;
00560 NumberFormat* numberFormat;
00561 double offset;
00562 PluralSelectorAdapter pluralRulesWrapper;
00563
00564 PluralFormat();
00565 void init(const PluralRules* rules, UPluralType type, UErrorCode& status);
00570 void copyObjects(const PluralFormat& other);
00571
00572 UnicodeString& format(const Formattable& numberObject, double number,
00573 UnicodeString& appendTo,
00574 FieldPosition& pos,
00575 UErrorCode& status) const;
00576
00588 static int32_t findSubMessage(
00589 const MessagePattern& pattern, int32_t partIndex,
00590 const PluralSelector& selector, void *context, double number, UErrorCode& ec);
00592 void parseType(const UnicodeString& source, const NFRule *rbnfLenientScanner,
00593 Formattable& result, FieldPosition& pos) const;
00594
00595 friend class MessageFormat;
00596 friend class NFRule;
00597 };
00598
00599 U_NAMESPACE_END
00600
00601 #endif
00602
00603 #endif
00604
00605 #endif // _PLURFMT
00606