ICU 73.2  73.2
smpdtfmt.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) 1997-2016, International Business Machines Corporation and
00005 * others. All Rights Reserved.
00006 *******************************************************************************
00007 *
00008 * File SMPDTFMT.H
00009 *
00010 * Modification History:
00011 *
00012 *   Date        Name        Description
00013 *   02/19/97    aliu        Converted from java.
00014 *   07/09/97    helena      Make ParsePosition into a class.
00015 *   07/21/98    stephen     Added GMT_PLUS, GMT_MINUS
00016 *                            Changed setTwoDigitStartDate to set2DigitYearStart
00017 *                            Changed getTwoDigitStartDate to get2DigitYearStart
00018 *                            Removed subParseLong
00019 *                            Removed getZoneIndex (added in DateFormatSymbols)
00020 *   06/14/99    stephen     Removed fgTimeZoneDataSuffix
00021 *   10/14/99    aliu        Updated class doc to describe 2-digit year parsing
00022 *                           {j28 4182066}.
00023 *******************************************************************************
00024 */
00025 
00026 #ifndef SMPDTFMT_H
00027 #define SMPDTFMT_H
00028 
00029 #include "unicode/utypes.h"
00030 
00031 #if U_SHOW_CPLUSPLUS_API
00032 
00038 #if !UCONFIG_NO_FORMATTING
00039 
00040 #include "unicode/datefmt.h"
00041 #include "unicode/udisplaycontext.h"
00042 #include "unicode/tzfmt.h"  /* for UTimeZoneFormatTimeType */
00043 #include "unicode/brkiter.h"
00044 
00045 U_NAMESPACE_BEGIN
00046 
00047 class DateFormatSymbols;
00048 class DateFormat;
00049 class MessageFormat;
00050 class FieldPositionHandler;
00051 class TimeZoneFormat;
00052 class SharedNumberFormat;
00053 class SimpleDateFormatMutableNFs;
00054 class DateIntervalFormat;
00055 
00056 namespace number {
00057 class LocalizedNumberFormatter;
00058 class SimpleNumberFormatter;
00059 }
00060 
00727 class U_I18N_API SimpleDateFormat: public DateFormat {
00728 public:
00738     SimpleDateFormat(UErrorCode& status);
00739 
00751     SimpleDateFormat(const UnicodeString& pattern,
00752                      UErrorCode& status);
00753 
00775     SimpleDateFormat(const UnicodeString& pattern,
00776                      const UnicodeString& override,
00777                      UErrorCode& status);
00778 
00791     SimpleDateFormat(const UnicodeString& pattern,
00792                      const Locale& locale,
00793                      UErrorCode& status);
00794 
00816     SimpleDateFormat(const UnicodeString& pattern,
00817                      const UnicodeString& override,
00818                      const Locale& locale,
00819                      UErrorCode& status);
00820 
00830     SimpleDateFormat(const UnicodeString& pattern,
00831                      DateFormatSymbols* formatDataToAdopt,
00832                      UErrorCode& status);
00833 
00843     SimpleDateFormat(const UnicodeString& pattern,
00844                      const DateFormatSymbols& formatData,
00845                      UErrorCode& status);
00846 
00851     SimpleDateFormat(const SimpleDateFormat&);
00852 
00857     SimpleDateFormat& operator=(const SimpleDateFormat&);
00858 
00863     virtual ~SimpleDateFormat();
00864 
00871     virtual SimpleDateFormat* clone() const override;
00872 
00880     virtual bool operator==(const Format& other) const override;
00881 
00882 
00883     using DateFormat::format;
00884 
00901     virtual UnicodeString& format(  Calendar& cal,
00902                                     UnicodeString& appendTo,
00903                                     FieldPosition& pos) const override;
00904 
00923     virtual UnicodeString& format(  Calendar& cal,
00924                                     UnicodeString& appendTo,
00925                                     FieldPositionIterator* posIter,
00926                                     UErrorCode& status) const override;
00927 
00928     using DateFormat::parse;
00929 
00956     virtual void parse( const UnicodeString& text,
00957                         Calendar& cal,
00958                         ParsePosition& pos) const override;
00959 
00960 
00977     virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00978 
00994     UDate get2DigitYearStart(UErrorCode& status) const;
00995 
01002     virtual UnicodeString& toPattern(UnicodeString& result) const;
01003 
01026     virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01027                                               UErrorCode& status) const;
01028 
01037     virtual void applyPattern(const UnicodeString& pattern);
01038 
01049     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01050                                        UErrorCode& status);
01051 
01060     virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01061 
01068     virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01069 
01075     virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01076 
01088     static UClassID U_EXPORT2 getStaticClassID(void);
01089 
01101     virtual UClassID getDynamicClassID(void) const override;
01102 
01112     virtual void adoptCalendar(Calendar* calendarToAdopt) override;
01113 
01114     /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following methods since they are virtual */
01122     virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01123 
01129     virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01130 
01136     virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01137 
01148     virtual void setContext(UDisplayContext value, UErrorCode& status) override;
01149 
01157     void adoptNumberFormat(NumberFormat *formatToAdopt) override;
01158 
01174     void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status);
01175 
01181     const NumberFormat * getNumberFormatForField(char16_t field) const;
01182 
01183 #ifndef U_HIDE_INTERNAL_API
01184 
01194     UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01195 
01196 
01208     static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01209                                     UCalendarDateFields field);
01210 
01219     const Locale& getSmpFmtLocale(void) const;
01220 #endif  /* U_HIDE_INTERNAL_API */
01221 
01222 private:
01223     friend class DateFormat;
01224     friend class DateIntervalFormat;
01225 
01226     void initializeDefaultCentury(void);
01227 
01228     void initializeBooleanAttributes(void);
01229 
01230     SimpleDateFormat() = delete; // default constructor not implemented
01231 
01240     SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01241 
01250     SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
01251 
01255     UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01256 
01273     void subFormat(UnicodeString &appendTo,
01274                    char16_t ch,
01275                    int32_t count,
01276                    UDisplayContext capitalizationContext,
01277                    int32_t fieldNum,
01278                    char16_t fieldToOutput,
01279                    FieldPositionHandler& handler,
01280                    Calendar& cal,
01281                    UErrorCode& status) const; // in case of illegal argument
01282 
01296     void zeroPaddingNumber(const NumberFormat *currentNumberFormat,
01297                            UnicodeString &appendTo,
01298                            int32_t value,
01299                            int32_t minDigits,
01300                            int32_t maxDigits) const;
01301 
01306     static UBool isNumeric(char16_t formatChar, int32_t count);
01307 
01311     static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01312 
01316     static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01317 
01325     Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01326 
01336     void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01337 
01344     void initialize(const Locale& locale, UErrorCode& status);
01345 
01359     int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01360                         const UnicodeString* stringArray, int32_t stringArrayCount,
01361                         const UnicodeString* monthPattern, Calendar& cal) const;
01362 
01375     int32_t matchAlphaMonthStrings(const UnicodeString& text, int32_t start,
01376                         const UnicodeString* wideStringArray, const UnicodeString* shortStringArray,
01377                         int32_t stringArrayCount, Calendar& cal) const;
01378 
01391     int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01392                                const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01393 
01397     int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01398                                   const UnicodeString* stringArray, int32_t stringArrayCount,
01399                                   int32_t &dayPeriod) const;
01400 
01416     static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01417                                const UnicodeString &text, int32_t &textOffset,
01418                                UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01419 
01440     int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count,
01441                      UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01442                      int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType,
01443                      int32_t *dayPeriod=nullptr) const;
01444 
01445     void parseInt(const UnicodeString& text,
01446                   Formattable& number,
01447                   ParsePosition& pos,
01448                   UBool allowNegative,
01449                   const NumberFormat *fmt) const;
01450 
01451     void parseInt(const UnicodeString& text,
01452                   Formattable& number,
01453                   int32_t maxDigits,
01454                   ParsePosition& pos,
01455                   UBool allowNegative,
01456                   const NumberFormat *fmt) const;
01457 
01458     int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01459                            int32_t patLoc, UBool isNegative) const;
01460 
01469     int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const;
01470 
01483     static void translatePattern(const UnicodeString& originalPattern,
01484                                 UnicodeString& translatedPattern,
01485                                 const UnicodeString& from,
01486                                 const UnicodeString& to,
01487                                 UErrorCode& status);
01488 
01496     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01497 
01507     int32_t compareSimpleAffix(const UnicodeString& affix,
01508                    const UnicodeString& input,
01509                    int32_t pos) const;
01510 
01515     int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01516 
01521     int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01522 
01526     void initSimpleNumberFormatter(UErrorCode &status);
01527 
01531     void initNumberFormatters(const Locale &locale,UErrorCode &status);
01532 
01536     void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01537 
01541     static const UCalendarDateFields fgPatternIndexToCalendarField[];
01542 
01546     static const UDateFormatField fgPatternIndexToDateFormatField[];
01547 
01551     TimeZoneFormat *tzFormat(UErrorCode &status) const;
01552 
01553     const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01554 
01561     static const int32_t fgCalendarFieldToLevel[];
01562 
01566     static int32_t getLevelFromChar(char16_t ch);
01567 
01571     static UBool isSyntaxChar(char16_t ch);
01572 
01576     UnicodeString       fPattern;
01577 
01581     UnicodeString       fDateOverride;
01582 
01586     UnicodeString       fTimeOverride;
01587 
01588 
01592     Locale              fLocale;
01593 
01598     DateFormatSymbols*  fSymbols = nullptr;   // Owned
01599 
01603     TimeZoneFormat* fTimeZoneFormat = nullptr;
01604 
01613     UDate                fDefaultCenturyStart;
01614 
01615     UBool                fHasMinute;
01616     UBool                fHasSecond;
01617     UBool                fHasHanYearChar; // pattern contains the Han year character \u5E74
01618 
01622     void                 parsePattern();
01623 
01627     /*transient*/ int32_t   fDefaultCenturyStartYear;
01628 
01629     struct NSOverride : public UMemory {
01630         const SharedNumberFormat *snf;
01631         int32_t hash;
01632         NSOverride *next;
01633         void free();
01634         NSOverride() : snf(nullptr), hash(0), next(nullptr) {
01635         }
01636         ~NSOverride();
01637     };
01638 
01643     const SharedNumberFormat    **fSharedNumberFormatters = nullptr;
01644 
01652     const number::SimpleNumberFormatter* fSimpleNumberFormatter = nullptr;
01653 
01654     UBool fHaveDefaultCentury;
01655 
01656     const BreakIterator* fCapitalizationBrkIter = nullptr;
01657 };
01658 
01659 inline UDate
01660 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
01661 {
01662     return fDefaultCenturyStart;
01663 }
01664 
01665 U_NAMESPACE_END
01666 
01667 #endif /* #if !UCONFIG_NO_FORMATTING */
01668 
01669 #endif /* U_SHOW_CPLUSPLUS_API */
01670 
01671 #endif // _SMPDTFMT
01672 //eof