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
00024 #if !UCONFIG_NO_FORMATTING
00025
00026 #include "unicode/messagepattern.h"
00027 #include "unicode/numfmt.h"
00028 #include "unicode/plurrule.h"
00029
00030 U_NAMESPACE_BEGIN
00031
00032 class Hashtable;
00033 class NFRule;
00034
00146 class U_I18N_API PluralFormat : public Format {
00147 public:
00148
00157 PluralFormat(UErrorCode& status);
00158
00168 PluralFormat(const Locale& locale, UErrorCode& status);
00169
00179 PluralFormat(const PluralRules& rules, UErrorCode& status);
00180
00197 PluralFormat(const Locale& locale, const PluralRules& rules, UErrorCode& status);
00198
00209 PluralFormat(const Locale& locale, UPluralType type, UErrorCode& status);
00210
00221 PluralFormat(const UnicodeString& pattern, UErrorCode& status);
00222
00237 PluralFormat(const Locale& locale, const UnicodeString& pattern, UErrorCode& status);
00238
00250 PluralFormat(const PluralRules& rules,
00251 const UnicodeString& pattern,
00252 UErrorCode& status);
00253
00268 PluralFormat(const Locale& locale,
00269 const PluralRules& rules,
00270 const UnicodeString& pattern,
00271 UErrorCode& status);
00272
00286 PluralFormat(const Locale& locale,
00287 UPluralType type,
00288 const UnicodeString& pattern,
00289 UErrorCode& status);
00290
00295 PluralFormat(const PluralFormat& other);
00296
00301 virtual ~PluralFormat();
00302
00315 void applyPattern(const UnicodeString& pattern, UErrorCode& status);
00316
00317
00318 using Format::format;
00319
00332 UnicodeString format(int32_t number, UErrorCode& status) const;
00333
00346 UnicodeString format(double number, UErrorCode& status) const;
00347
00364 UnicodeString& format(int32_t number,
00365 UnicodeString& appendTo,
00366 FieldPosition& pos,
00367 UErrorCode& status) const;
00368
00385 UnicodeString& format(double number,
00386 UnicodeString& appendTo,
00387 FieldPosition& pos,
00388 UErrorCode& status) const;
00389
00390 #ifndef U_HIDE_DEPRECATED_API
00391
00406 void setLocale(const Locale& locale, UErrorCode& status);
00407 #endif
00408
00418 void setNumberFormat(const NumberFormat* format, UErrorCode& status);
00419
00426 PluralFormat& operator=(const PluralFormat& other);
00427
00435 virtual UBool operator==(const Format& other) const;
00436
00444 virtual UBool operator!=(const Format& other) const;
00445
00451 virtual Format* clone(void) const;
00452
00467 UnicodeString& format(const Formattable& obj,
00468 UnicodeString& appendTo,
00469 FieldPosition& pos,
00470 UErrorCode& status) const;
00471
00480 UnicodeString& toPattern(UnicodeString& appendTo);
00481
00504 virtual void parseObject(const UnicodeString& source,
00505 Formattable& result,
00506 ParsePosition& parse_pos) const;
00507
00514 static UClassID U_EXPORT2 getStaticClassID(void);
00515
00521 virtual UClassID getDynamicClassID() const;
00522
00523 private:
00527 class U_I18N_API PluralSelector : public UMemory {
00528 public:
00529 virtual ~PluralSelector();
00539 virtual UnicodeString select(void *context, double number, UErrorCode& ec) const = 0;
00540 };
00541
00545 class U_I18N_API PluralSelectorAdapter : public PluralSelector {
00546 public:
00547 PluralSelectorAdapter() : pluralRules(NULL) {
00548 }
00549
00550 virtual ~PluralSelectorAdapter();
00551
00552 virtual UnicodeString select(void *context, double number, UErrorCode& ) const;
00554 void reset();
00555
00556 PluralRules* pluralRules;
00557 };
00558
00559 Locale locale;
00560 MessagePattern msgPattern;
00561 NumberFormat* numberFormat;
00562 double offset;
00563 PluralSelectorAdapter pluralRulesWrapper;
00564
00565 PluralFormat();
00566 void init(const PluralRules* rules, UPluralType type, UErrorCode& status);
00571 void copyObjects(const PluralFormat& other);
00572
00573 UnicodeString& format(const Formattable& numberObject, double number,
00574 UnicodeString& appendTo,
00575 FieldPosition& pos,
00576 UErrorCode& status) const;
00589 static int32_t findSubMessage(
00590 const MessagePattern& pattern, int32_t partIndex,
00591 const PluralSelector& selector, void *context, double number, UErrorCode& ec);
00593 void parseType(const UnicodeString& source, const NFRule *rbnfLenientScanner,
00594 Formattable& result, FieldPosition& pos) const;
00595
00596 friend class MessageFormat;
00597 friend class NFRule;
00598 };
00599
00600 U_NAMESPACE_END
00601
00602 #endif
00603
00604 #endif // _PLURFMT
00605