00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef PLURFMT
00013 #define PLURFMT
00014
00015 #include "unicode/utypes.h"
00016
00022 #if !UCONFIG_NO_FORMATTING
00023
00024 #include "unicode/messagepattern.h"
00025 #include "unicode/numfmt.h"
00026 #include "unicode/plurrule.h"
00027
00028 U_NAMESPACE_BEGIN
00029
00030 class Hashtable;
00031 class NFRule;
00032
00144 class U_I18N_API PluralFormat : public Format {
00145 public:
00146
00155 PluralFormat(UErrorCode& status);
00156
00166 PluralFormat(const Locale& locale, UErrorCode& status);
00167
00177 PluralFormat(const PluralRules& rules, UErrorCode& status);
00178
00195 PluralFormat(const Locale& locale, const PluralRules& rules, UErrorCode& status);
00196
00207 PluralFormat(const Locale& locale, UPluralType type, UErrorCode& status);
00208
00219 PluralFormat(const UnicodeString& pattern, UErrorCode& status);
00220
00235 PluralFormat(const Locale& locale, const UnicodeString& pattern, UErrorCode& status);
00236
00248 PluralFormat(const PluralRules& rules,
00249 const UnicodeString& pattern,
00250 UErrorCode& status);
00251
00266 PluralFormat(const Locale& locale,
00267 const PluralRules& rules,
00268 const UnicodeString& pattern,
00269 UErrorCode& status);
00270
00284 PluralFormat(const Locale& locale,
00285 UPluralType type,
00286 const UnicodeString& pattern,
00287 UErrorCode& status);
00288
00293 PluralFormat(const PluralFormat& other);
00294
00299 virtual ~PluralFormat();
00300
00313 void applyPattern(const UnicodeString& pattern, UErrorCode& status);
00314
00315
00316 using Format::format;
00317
00330 UnicodeString format(int32_t number, UErrorCode& status) const;
00331
00344 UnicodeString format(double number, UErrorCode& status) const;
00345
00362 UnicodeString& format(int32_t number,
00363 UnicodeString& appendTo,
00364 FieldPosition& pos,
00365 UErrorCode& status) const;
00366
00383 UnicodeString& format(double number,
00384 UnicodeString& appendTo,
00385 FieldPosition& pos,
00386 UErrorCode& status) const;
00387
00388 #ifndef U_HIDE_DEPRECATED_API
00389
00404 void setLocale(const Locale& locale, UErrorCode& status);
00405 #endif
00406
00416 void setNumberFormat(const NumberFormat* format, UErrorCode& status);
00417
00424 PluralFormat& operator=(const PluralFormat& other);
00425
00433 virtual UBool operator==(const Format& other) const;
00434
00442 virtual UBool operator!=(const Format& other) const;
00443
00449 virtual Format* clone(void) const;
00450
00465 UnicodeString& format(const Formattable& obj,
00466 UnicodeString& appendTo,
00467 FieldPosition& pos,
00468 UErrorCode& status) const;
00469
00478 UnicodeString& toPattern(UnicodeString& appendTo);
00479
00502 virtual void parseObject(const UnicodeString& source,
00503 Formattable& result,
00504 ParsePosition& parse_pos) const;
00505
00512 static UClassID U_EXPORT2 getStaticClassID(void);
00513
00519 virtual UClassID getDynamicClassID() const;
00520
00521 #if (defined(__xlC__) && (__xlC__ < 0x0C00)) || (U_PLATFORM == U_PF_OS390) || (U_PLATFORM ==U_PF_OS400)
00522
00523
00524
00525
00526 public:
00527 #else
00528 private:
00529 #endif
00530
00533 class U_I18N_API PluralSelector : public UMemory {
00534 public:
00535 virtual ~PluralSelector();
00545 virtual UnicodeString select(void *context, double number, UErrorCode& ec) const = 0;
00546 };
00547
00551 class U_I18N_API PluralSelectorAdapter : public PluralSelector {
00552 public:
00553 PluralSelectorAdapter() : pluralRules(NULL) {
00554 }
00555
00556 virtual ~PluralSelectorAdapter();
00557
00558 virtual UnicodeString select(void *context, double number, UErrorCode& ) const;
00560 void reset();
00561
00562 PluralRules* pluralRules;
00563 };
00564
00565 #if defined(__xlC__)
00566
00567 private:
00568 #endif
00569 Locale locale;
00570 MessagePattern msgPattern;
00571 NumberFormat* numberFormat;
00572 double offset;
00573 PluralSelectorAdapter pluralRulesWrapper;
00574
00575 PluralFormat();
00576 void init(const PluralRules* rules, UPluralType type, UErrorCode& status);
00581 void copyObjects(const PluralFormat& other);
00582
00583 UnicodeString& format(const Formattable& numberObject, double number,
00584 UnicodeString& appendTo,
00585 FieldPosition& pos,
00586 UErrorCode& status) const;
00599 static int32_t findSubMessage(
00600 const MessagePattern& pattern, int32_t partIndex,
00601 const PluralSelector& selector, void *context, double number, UErrorCode& ec);
00603 void parseType(const UnicodeString& source, const NFRule *rbnfLenientScanner,
00604 Formattable& result, FieldPosition& pos) const;
00605
00606 friend class MessageFormat;
00607 friend class NFRule;
00608 };
00609
00610 U_NAMESPACE_END
00611
00612 #endif
00613
00614 #endif // _PLURFMT
00615