ICU 73.2  73.2
msgfmt.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 * Copyright (C) 2007-2013, International Business Machines Corporation and
00005 * others. All Rights Reserved.
00006 ********************************************************************************
00007 *
00008 * File MSGFMT.H
00009 *
00010 * Modification History:
00011 *
00012 *   Date        Name        Description
00013 *   02/19/97    aliu        Converted from java.
00014 *   03/20/97    helena      Finished first cut of implementation.
00015 *   07/22/98    stephen     Removed operator!= (defined in Format)
00016 *   08/19/2002  srl         Removing Javaisms
00017 *******************************************************************************/
00018 
00019 #ifndef MSGFMT_H
00020 #define MSGFMT_H
00021 
00022 #include "unicode/utypes.h"
00023 
00024 #if U_SHOW_CPLUSPLUS_API
00025 
00031 #if !UCONFIG_NO_FORMATTING
00032 
00033 #include "unicode/format.h"
00034 #include "unicode/locid.h"
00035 #include "unicode/messagepattern.h"
00036 #include "unicode/parseerr.h"
00037 #include "unicode/plurfmt.h"
00038 #include "unicode/plurrule.h"
00039 
00040 U_CDECL_BEGIN
00041 // Forward declaration.
00042 struct UHashtable;
00043 typedef struct UHashtable UHashtable; 
00044 U_CDECL_END
00045 
00046 U_NAMESPACE_BEGIN
00047 
00048 class AppendableWrapper;
00049 class DateFormat;
00050 class NumberFormat;
00051 
00345 class U_I18N_API MessageFormat : public Format {
00346 public:
00347 #ifndef U_HIDE_OBSOLETE_API
00348 
00353     enum EFormatNumber {
00359         kMaxFormat = 10
00360     };
00361 #endif  /* U_HIDE_OBSOLETE_API */
00362 
00372     MessageFormat(const UnicodeString& pattern,
00373                   UErrorCode &status);
00374 
00383     MessageFormat(const UnicodeString& pattern,
00384                   const Locale& newLocale,
00385                         UErrorCode& status);
00396     MessageFormat(const UnicodeString& pattern,
00397                   const Locale& newLocale,
00398                   UParseError& parseError,
00399                   UErrorCode& status);
00404     MessageFormat(const MessageFormat&);
00405 
00410     const MessageFormat& operator=(const MessageFormat&);
00411 
00416     virtual ~MessageFormat();
00417 
00423     virtual MessageFormat* clone() const override;
00424 
00432     virtual bool operator==(const Format& other) const override;
00433 
00439     virtual void setLocale(const Locale& theLocale);
00440 
00447     virtual const Locale& getLocale(void) const;
00448 
00457     virtual void applyPattern(const UnicodeString& pattern,
00458                               UErrorCode& status);
00469     virtual void applyPattern(const UnicodeString& pattern,
00470                              UParseError& parseError,
00471                              UErrorCode& status);
00472 
00491     virtual void applyPattern(const UnicodeString& pattern,
00492                               UMessagePatternApostropheMode aposMode,
00493                               UParseError* parseError,
00494                               UErrorCode& status);
00495 
00500     UMessagePatternApostropheMode getApostropheMode() const {
00501         return msgPattern.getApostropheMode();
00502     }
00503 
00512     virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00513 
00530     virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00531 
00546     virtual void setFormats(const Format** newFormats, int32_t cnt);
00547 
00548 
00563     virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00564 
00574     virtual void setFormat(int32_t formatNumber, const Format& format);
00575 
00584     virtual StringEnumeration* getFormatNames(UErrorCode& status);
00585 
00599     virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00600 
00614     virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00615 
00630     virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00631 
00644     virtual const Format** getFormats(int32_t& count) const;
00645 
00646 
00647     using Format::format;
00648 
00666     UnicodeString& format(const Formattable* source,
00667                           int32_t count,
00668                           UnicodeString& appendTo,
00669                           FieldPosition& ignore,
00670                           UErrorCode& status) const;
00671 
00689     static UnicodeString& format(const UnicodeString& pattern,
00690                                  const Formattable* arguments,
00691                                  int32_t count,
00692                                  UnicodeString& appendTo,
00693                                  UErrorCode& status);
00694 
00715     virtual UnicodeString& format(const Formattable& obj,
00716                                   UnicodeString& appendTo,
00717                                   FieldPosition& pos,
00718                                   UErrorCode& status) const override;
00719 
00738     UnicodeString& format(const UnicodeString* argumentNames,
00739                           const Formattable* arguments,
00740                           int32_t count,
00741                           UnicodeString& appendTo,
00742                           UErrorCode& status) const;
00756     virtual Formattable* parse(const UnicodeString& source,
00757                                ParsePosition& pos,
00758                                int32_t& count) const;
00759 
00775     virtual Formattable* parse(const UnicodeString& source,
00776                                int32_t& count,
00777                                UErrorCode& status) const;
00778 
00791     virtual void parseObject(const UnicodeString& source,
00792                              Formattable& result,
00793                              ParsePosition& pos) const override;
00794 
00814     static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00815         UErrorCode& status);
00816 
00817 
00825     UBool usesNamedArguments() const;
00826 
00827 
00828 #ifndef U_HIDE_INTERNAL_API
00829 
00839     int32_t getArgTypeCount() const;
00840 #endif  /* U_HIDE_INTERNAL_API */
00841 
00853     virtual UClassID getDynamicClassID(void) const override;
00854 
00866     static UClassID U_EXPORT2 getStaticClassID(void);
00867 
00868 #ifndef U_HIDE_INTERNAL_API
00869 
00879     static UBool equalFormats(const void* left, const void* right);
00880 #endif  /* U_HIDE_INTERNAL_API */
00881 
00882 private:
00883 
00884     Locale              fLocale;
00885     MessagePattern      msgPattern;
00886     Format**            formatAliases; // see getFormats
00887     int32_t             formatAliasesCapacity;
00888 
00889     MessageFormat() = delete; // default constructor not implemented
00890 
00897     class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00898     public:
00899         PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
00900         virtual ~PluralSelectorProvider();
00901         virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const override;
00902 
00903         void reset();
00904     private:
00905         const MessageFormat &msgFormat;
00906         PluralRules* rules;
00907         UPluralType type;
00908     };
00909 
00918     Formattable::Type* argTypes;
00919     int32_t            argTypeCount;
00920     int32_t            argTypeCapacity;
00921 
00927     UBool hasArgTypeConflicts;
00928 
00929     // Variable-size array management
00930     UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00931 
00939     NumberFormat* defaultNumberFormat;
00940     DateFormat*   defaultDateFormat;
00941 
00942     UHashtable* cachedFormatters;
00943     UHashtable* customFormatArgStarts;
00944 
00945     PluralSelectorProvider pluralProvider;
00946     PluralSelectorProvider ordinalProvider;
00947 
00952     const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00953     const DateFormat*   getDefaultDateFormat(UErrorCode&) const;
00954 
00961     static int32_t findKeyword( const UnicodeString& s,
00962                                 const char16_t * const *list);
00963 
00969     UnicodeString& format(const Formattable* arguments,
00970                           const UnicodeString *argumentNames,
00971                           int32_t cnt,
00972                           UnicodeString& appendTo,
00973                           FieldPosition* pos,
00974                           UErrorCode& status) const;
00975 
00993     void format(int32_t msgStart,
00994                 const void *plNumber,
00995                 const Formattable* arguments,
00996                 const UnicodeString *argumentNames,
00997                 int32_t cnt,
00998                 AppendableWrapper& appendTo,
00999                 FieldPosition* pos,
01000                 UErrorCode& success) const;
01001 
01002     UnicodeString getArgName(int32_t partIndex);
01003 
01004     void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01005 
01006     void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01007 
01008     int32_t nextTopLevelArgStart(int32_t partIndex) const;
01009 
01010     UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
01011 
01012     void cacheExplicitFormats(UErrorCode& status);
01013 
01014     Format* createAppropriateFormat(UnicodeString& type,
01015                                     UnicodeString& style,
01016                                     Formattable::Type& formattableType,
01017                                     UParseError& parseError,
01018                                     UErrorCode& ec);
01019 
01020     const Formattable* getArgFromListByName(const Formattable* arguments,
01021                                             const UnicodeString *argumentNames,
01022                                             int32_t cnt, UnicodeString& name) const;
01023 
01024     Formattable* parse(int32_t msgStart,
01025                        const UnicodeString& source,
01026                        ParsePosition& pos,
01027                        int32_t& count,
01028                        UErrorCode& ec) const;
01029 
01030     FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01031                                   FieldPosition* fp, const Formattable* argId) const;
01032 
01038     int32_t findOtherSubMessage(int32_t partIndex) const;
01039 
01045     int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
01046 
01047     Format* getCachedFormatter(int32_t argumentNumber) const;
01048 
01049     UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01050 
01051     void copyObjects(const MessageFormat& that, UErrorCode& ec);
01052 
01053     void formatComplexSubMessage(int32_t msgStart,
01054                                  const void *plNumber,
01055                                  const Formattable* arguments,
01056                                  const UnicodeString *argumentNames,
01057                                  int32_t cnt,
01058                                  AppendableWrapper& appendTo,
01059                                  UErrorCode& success) const;
01060 
01064     NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01065 
01073     const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01074         listCount = argTypeCount;
01075         return argTypes;
01076     }
01077 
01081     void resetPattern();
01082 
01087     class U_I18N_API DummyFormat : public Format {
01088     public:
01089         virtual bool operator==(const Format&) const override;
01090         virtual DummyFormat* clone() const override;
01091         virtual UnicodeString& format(const Formattable& obj,
01092                               UnicodeString& appendTo,
01093                               UErrorCode& status) const;
01094         virtual UnicodeString& format(const Formattable&,
01095                                       UnicodeString& appendTo,
01096                                       FieldPosition&,
01097                                       UErrorCode& status) const override;
01098         virtual UnicodeString& format(const Formattable& obj,
01099                                       UnicodeString& appendTo,
01100                                       FieldPositionIterator* posIter,
01101                                       UErrorCode& status) const override;
01102         virtual void parseObject(const UnicodeString&,
01103                                  Formattable&,
01104                                  ParsePosition&) const override;
01105     };
01106 
01107     friend class MessageFormatAdapter; // getFormatTypeList() access
01108 };
01109 
01110 U_NAMESPACE_END
01111 
01112 #endif /* #if !UCONFIG_NO_FORMATTING */
01113 
01114 #endif /* U_SHOW_CPLUSPLUS_API */
01115 
01116 #endif // _MSGFMT
01117 //eof