|
ICU 73.2
73.2
|
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
1.7.6.1