ICU 73.2  73.2
plurfmt.h
Go to the documentation of this file.
00001 // © 2016 and later: Unicode, Inc. and others.
00002 // License & terms of use: http://www.unicode.org/copyright.html
00003 /*
00004 *******************************************************************************
00005 * Copyright (C) 2007-2014, International Business Machines Corporation and
00006 * others. All Rights Reserved.
00007 *******************************************************************************
00008 *
00009 
00010 * File PLURFMT.H
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  /* U_HIDE_DEPRECATED_API */
00410 
00420     void setNumberFormat(const NumberFormat* format, UErrorCode& status);
00421 
00428     PluralFormat& operator=(const PluralFormat& other);
00429 
00437     virtual bool operator==(const Format& other) const override;
00438 
00446     virtual bool operator!=(const Format& other) const;
00447 
00453     virtual PluralFormat* clone() const override;
00454 
00469    UnicodeString& format(const Formattable& obj,
00470                          UnicodeString& appendTo,
00471                          FieldPosition& pos,
00472                          UErrorCode& status) const override;
00473 
00482    UnicodeString& toPattern(UnicodeString& appendTo);
00483 
00506    virtual void parseObject(const UnicodeString& source,
00507                             Formattable& result,
00508                             ParsePosition& parse_pos) const override;
00509 
00516     static UClassID U_EXPORT2 getStaticClassID(void);
00517 
00523      virtual UClassID getDynamicClassID() const override;
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(nullptr) {
00547         }
00548 
00549         virtual ~PluralSelectorAdapter();
00550 
00551         virtual UnicodeString select(void *context, double number, UErrorCode& /*ec*/) const override;
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() = delete;   // default constructor not implemented
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);
00591 
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 /* #if !UCONFIG_NO_FORMATTING */
00602 
00603 #endif /* U_SHOW_CPLUSPLUS_API */
00604 
00605 #endif // _PLURFMT
00606 //eof