ICU 49.1.1  49.1.1
msgfmt.h
Go to the documentation of this file.
1 /*
2 * Copyright (C) 2007-2012, International Business Machines Corporation and
3 * others. All Rights Reserved.
4 ********************************************************************************
5 *
6 * File MSGFMT.H
7 *
8 * Modification History:
9 *
10 * Date Name Description
11 * 02/19/97 aliu Converted from java.
12 * 03/20/97 helena Finished first cut of implementation.
13 * 07/22/98 stephen Removed operator!= (defined in Format)
14 * 08/19/2002 srl Removing Javaisms
15 *******************************************************************************/
16 
17 #ifndef MSGFMT_H
18 #define MSGFMT_H
19 
20 #include "unicode/utypes.h"
21 
27 #if !UCONFIG_NO_FORMATTING
28 
29 #include "unicode/format.h"
30 #include "unicode/locid.h"
31 #include "unicode/messagepattern.h"
32 #include "unicode/parseerr.h"
33 #include "unicode/plurfmt.h"
34 #include "unicode/plurrule.h"
35 
37 // Forward declaration.
38 struct UHashtable;
39 typedef struct UHashtable UHashtable;
41 
43 
44 class AppendableWrapper;
45 class DateFormat;
46 class NumberFormat;
47 
323 public:
324 #ifndef U_HIDE_OBSOLETE_API
325 
336  kMaxFormat = 10
337  };
338 #endif /* U_HIDE_OBSOLETE_API */
339 
349  MessageFormat(const UnicodeString& pattern,
350  UErrorCode &status);
351 
360  MessageFormat(const UnicodeString& pattern,
361  const Locale& newLocale,
362  UErrorCode& status);
373  MessageFormat(const UnicodeString& pattern,
374  const Locale& newLocale,
375  UParseError& parseError,
376  UErrorCode& status);
382 
387  const MessageFormat& operator=(const MessageFormat&);
388 
393  virtual ~MessageFormat();
394 
400  virtual Format* clone(void) const;
401 
409  virtual UBool operator==(const Format& other) const;
410 
416  virtual void setLocale(const Locale& theLocale);
417 
424  virtual const Locale& getLocale(void) const;
425 
434  virtual void applyPattern(const UnicodeString& pattern,
435  UErrorCode& status);
446  virtual void applyPattern(const UnicodeString& pattern,
447  UParseError& parseError,
448  UErrorCode& status);
449 
468  virtual void applyPattern(const UnicodeString& pattern,
470  UParseError* parseError,
471  UErrorCode& status);
472 
478  return msgPattern.getApostropheMode();
479  }
480 
489  virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
490 
507  virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
508 
523  virtual void setFormats(const Format** newFormats, int32_t cnt);
524 
525 
540  virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
541 
551  virtual void setFormat(int32_t formatNumber, const Format& format);
552 
561  virtual StringEnumeration* getFormatNames(UErrorCode& status);
562 
576  virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
577 
591  virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
592 
607  virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
608 
621  virtual const Format** getFormats(int32_t& count) const;
622 
623 
624  using Format::format;
625 
643  UnicodeString& format(const Formattable* source,
644  int32_t count,
645  UnicodeString& appendTo,
646  FieldPosition& ignore,
647  UErrorCode& status) const;
648 
666  static UnicodeString& format(const UnicodeString& pattern,
667  const Formattable* arguments,
668  int32_t count,
669  UnicodeString& appendTo,
670  UErrorCode& status);
671 
692  virtual UnicodeString& format(const Formattable& obj,
693  UnicodeString& appendTo,
694  FieldPosition& pos,
695  UErrorCode& status) const;
696 
711  UnicodeString& format(const Formattable& obj,
712  UnicodeString& appendTo,
713  UErrorCode& status) const;
714 
715 
734  UnicodeString& format(const UnicodeString* argumentNames,
735  const Formattable* arguments,
736  int32_t count,
737  UnicodeString& appendTo,
738  UErrorCode& status) const;
752  virtual Formattable* parse(const UnicodeString& source,
753  ParsePosition& pos,
754  int32_t& count) const;
755 
771  virtual Formattable* parse(const UnicodeString& source,
772  int32_t& count,
773  UErrorCode& status) const;
774 
787  virtual void parseObject(const UnicodeString& source,
788  Formattable& result,
789  ParsePosition& pos) const;
790 
810  static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
811  UErrorCode& status);
812 
813 
821  UBool usesNamedArguments() const;
822 
823 
824 #ifndef U_HIDE_INTERNAL_API
825 
835  int32_t getArgTypeCount() const;
836 #endif /* U_HIDE_INTERNAL_API */
837 
849  virtual UClassID getDynamicClassID(void) const;
850 
862  static UClassID U_EXPORT2 getStaticClassID(void);
863 
864 #ifndef U_HIDE_INTERNAL_API
865 
875  static UBool equalFormats(const void* left, const void* right);
876 #endif /* U_HIDE_INTERNAL_API */
877 
878 private:
879 
880  Locale fLocale;
881  MessagePattern msgPattern;
882  Format** formatAliases; // see getFormats
883  int32_t formatAliasesCapacity;
884 
885  MessageFormat(); // default constructor not implemented
886 
893  class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
894  public:
895  PluralSelectorProvider(const Locale* loc);
896  virtual ~PluralSelectorProvider();
897  virtual UnicodeString select(double number, UErrorCode& ec) const;
898 
899  void reset(const Locale* loc);
900  private:
901  const Locale* locale;
902  PluralRules* rules;
903  };
904 
913  Formattable::Type* argTypes;
914  int32_t argTypeCount;
915  int32_t argTypeCapacity;
916 
922  UBool hasArgTypeConflicts;
923 
924  // Variable-size array management
925  UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
926 
934  NumberFormat* defaultNumberFormat;
935  DateFormat* defaultDateFormat;
936 
937  UHashtable* cachedFormatters;
938  UHashtable* customFormatArgStarts;
939 
940  PluralSelectorProvider pluralProvider;
941 
946  const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
947  const DateFormat* getDefaultDateFormat(UErrorCode&) const;
948 
955  static int32_t findKeyword( const UnicodeString& s,
956  const UChar * const *list);
957 
963  UnicodeString& format(const Formattable* arguments,
964  const UnicodeString *argumentNames,
965  int32_t cnt,
966  UnicodeString& appendTo,
967  FieldPosition* pos,
968  UErrorCode& status) const;
969 
987  void format(int32_t msgStart,
988  double pluralNumber,
989  const Formattable* arguments,
990  const UnicodeString *argumentNames,
991  int32_t cnt,
992  AppendableWrapper& appendTo,
993  FieldPosition* pos,
994  UErrorCode& success) const;
995 
996  UnicodeString getArgName(int32_t partIndex);
997 
998  void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
999 
1000  void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
1001 
1002  int32_t nextTopLevelArgStart(int32_t partIndex) const;
1003 
1004  UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
1005 
1006  void cacheExplicitFormats(UErrorCode& status);
1007 
1008  Format* createAppropriateFormat(UnicodeString& type,
1009  UnicodeString& style,
1010  Formattable::Type& formattableType,
1011  UParseError& parseError,
1012  UErrorCode& ec);
1013 
1014  const Formattable* getArgFromListByName(const Formattable* arguments,
1015  const UnicodeString *argumentNames,
1016  int32_t cnt, UnicodeString& name) const;
1017 
1018  Formattable* parse(int32_t msgStart,
1019  const UnicodeString& source,
1020  ParsePosition& pos,
1021  int32_t& count,
1022  UErrorCode& ec) const;
1023 
1024  FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
1025  FieldPosition* fp, const Formattable* argId) const;
1026 
1027  Format* getCachedFormatter(int32_t argumentNumber) const;
1028 
1029  UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
1030 
1031  void copyObjects(const MessageFormat& that, UErrorCode& ec);
1032 
1033  void formatComplexSubMessage(int32_t msgStart,
1034  double pluralNumber,
1035  const Formattable* arguments,
1036  const UnicodeString *argumentNames,
1037  int32_t cnt,
1038  AppendableWrapper& appendTo,
1039  UErrorCode& success) const;
1040 
1044  NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
1045 
1054  const Formattable::Type* getArgTypeList(int32_t& listCount) const {
1055  listCount = argTypeCount;
1056  return argTypes;
1057  }
1058 
1062  void resetPattern();
1063 
1069  class U_I18N_API DummyFormat : public Format {
1070  public:
1071  virtual UBool operator==(const Format&) const;
1072  virtual Format* clone() const;
1073  virtual UnicodeString& format(const Formattable&,
1074  UnicodeString& appendTo,
1075  FieldPosition&,
1076  UErrorCode& status) const;
1077  virtual void parseObject(const UnicodeString&,
1078  Formattable&,
1079  ParsePosition&) const;
1080  virtual UClassID getDynamicClassID() const;
1081  };
1082 
1083  friend class MessageFormatAdapter; // getFormatTypeList() access
1084 };
1085 
1086 inline UnicodeString&
1088  UnicodeString& appendTo,
1089  UErrorCode& status) const {
1090  return Format::format(obj, appendTo, status);
1091 }
1092 
1093 
1095 
1096 #endif /* #if !UCONFIG_NO_FORMATTING */
1097 
1098 #endif // _MSGFMT
1099 //eof