| // © 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /* |
| ******************************************************************************* |
| * Copyright (C) 2007-2016, International Business Machines Corporation and |
| * others. All Rights Reserved. |
| ******************************************************************************* |
| * |
| * File DTPTNGEN.H |
| * |
| ******************************************************************************* |
| */ |
| |
| #ifndef __DTPTNGEN_IMPL_H__ |
| #define __DTPTNGEN_IMPL_H__ |
| |
| #include "unicode/udatpg.h" |
| |
| #include "unicode/strenum.h" |
| #include "unicode/unistr.h" |
| #include "uvector.h" |
| |
| // TODO(claireho): Split off Builder class. |
| // TODO(claireho): If splitting off Builder class: As subclass or independent? |
| |
| #define MAX_PATTERN_ENTRIES 52 |
| #define MAX_CLDR_FIELD_LEN 60 |
| #define MAX_DT_TOKEN 50 |
| #define MAX_RESOURCE_FIELD 12 |
| #define MAX_AVAILABLE_FORMATS 12 |
| #define NONE 0 |
| #define EXTRA_FIELD 0x10000 |
| #define MISSING_FIELD 0x1000 |
| #define MAX_STRING_ENUMERATION 200 |
| #define SINGLE_QUOTE ((UChar)0x0027) |
| #define FORWARDSLASH ((UChar)0x002F) |
| #define BACKSLASH ((UChar)0x005C) |
| #define SPACE ((UChar)0x0020) |
| #define QUOTATION_MARK ((UChar)0x0022) |
| #define ASTERISK ((UChar)0x002A) |
| #define PLUSSITN ((UChar)0x002B) |
| #define COMMA ((UChar)0x002C) |
| #define HYPHEN ((UChar)0x002D) |
| #define DOT ((UChar)0x002E) |
| #define COLON ((UChar)0x003A) |
| #define CAP_A ((UChar)0x0041) |
| #define CAP_B ((UChar)0x0042) |
| #define CAP_C ((UChar)0x0043) |
| #define CAP_D ((UChar)0x0044) |
| #define CAP_E ((UChar)0x0045) |
| #define CAP_F ((UChar)0x0046) |
| #define CAP_G ((UChar)0x0047) |
| #define CAP_H ((UChar)0x0048) |
| #define CAP_J ((UChar)0x004A) |
| #define CAP_K ((UChar)0x004B) |
| #define CAP_L ((UChar)0x004C) |
| #define CAP_M ((UChar)0x004D) |
| #define CAP_O ((UChar)0x004F) |
| #define CAP_Q ((UChar)0x0051) |
| #define CAP_S ((UChar)0x0053) |
| #define CAP_T ((UChar)0x0054) |
| #define CAP_U ((UChar)0x0055) |
| #define CAP_V ((UChar)0x0056) |
| #define CAP_W ((UChar)0x0057) |
| #define CAP_X ((UChar)0x0058) |
| #define CAP_Y ((UChar)0x0059) |
| #define CAP_Z ((UChar)0x005A) |
| #define LOWLINE ((UChar)0x005F) |
| #define LOW_A ((UChar)0x0061) |
| #define LOW_B ((UChar)0x0062) |
| #define LOW_C ((UChar)0x0063) |
| #define LOW_D ((UChar)0x0064) |
| #define LOW_E ((UChar)0x0065) |
| #define LOW_F ((UChar)0x0066) |
| #define LOW_G ((UChar)0x0067) |
| #define LOW_H ((UChar)0x0068) |
| #define LOW_I ((UChar)0x0069) |
| #define LOW_J ((UChar)0x006A) |
| #define LOW_K ((UChar)0x006B) |
| #define LOW_L ((UChar)0x006C) |
| #define LOW_M ((UChar)0x006D) |
| #define LOW_N ((UChar)0x006E) |
| #define LOW_O ((UChar)0x006F) |
| #define LOW_P ((UChar)0x0070) |
| #define LOW_Q ((UChar)0x0071) |
| #define LOW_R ((UChar)0x0072) |
| #define LOW_S ((UChar)0x0073) |
| #define LOW_T ((UChar)0x0074) |
| #define LOW_U ((UChar)0x0075) |
| #define LOW_V ((UChar)0x0076) |
| #define LOW_W ((UChar)0x0077) |
| #define LOW_X ((UChar)0x0078) |
| #define LOW_Y ((UChar)0x0079) |
| #define LOW_Z ((UChar)0x007A) |
| #define DT_NARROW -0x101 |
| #define DT_SHORTER -0x102 |
| #define DT_SHORT -0x103 |
| #define DT_LONG -0x104 |
| #define DT_NUMERIC 0x100 |
| #define DT_DELTA 0x10 |
| |
| U_NAMESPACE_BEGIN |
| |
| const int32_t UDATPG_FRACTIONAL_MASK = 1<<UDATPG_FRACTIONAL_SECOND_FIELD; |
| const int32_t UDATPG_SECOND_AND_FRACTIONAL_MASK = (1<<UDATPG_SECOND_FIELD) | (1<<UDATPG_FRACTIONAL_SECOND_FIELD); |
| |
| typedef enum dtStrEnum { |
| DT_BASESKELETON, |
| DT_SKELETON, |
| DT_PATTERN |
| }dtStrEnum; |
| |
| typedef struct dtTypeElem { |
| UChar patternChar; |
| UDateTimePatternField field; |
| int16_t type; |
| int16_t minLen; |
| int16_t weight; |
| } dtTypeElem; |
| |
| // A compact storage mechanism for skeleton field strings. Several dozen of these will be created |
| // for a typical DateTimePatternGenerator instance. |
| class SkeletonFields : public UMemory { |
| public: |
| SkeletonFields(); |
| void clear(); |
| void copyFrom(const SkeletonFields& other); |
| void clearField(int32_t field); |
| UChar getFieldChar(int32_t field) const; |
| int32_t getFieldLength(int32_t field) const; |
| void populate(int32_t field, const UnicodeString& value); |
| void populate(int32_t field, UChar repeatChar, int32_t repeatCount); |
| UBool isFieldEmpty(int32_t field) const; |
| UnicodeString& appendTo(UnicodeString& string) const; |
| UnicodeString& appendFieldTo(int32_t field, UnicodeString& string) const; |
| UChar getFirstChar() const; |
| inline UBool operator==(const SkeletonFields& other) const; |
| inline UBool operator!=(const SkeletonFields& other) const; |
| |
| private: |
| int8_t chars[UDATPG_FIELD_COUNT]; |
| int8_t lengths[UDATPG_FIELD_COUNT]; |
| }; |
| |
| inline UBool SkeletonFields::operator==(const SkeletonFields& other) const { |
| return (uprv_memcmp(chars, other.chars, sizeof(chars)) == 0 |
| && uprv_memcmp(lengths, other.lengths, sizeof(lengths)) == 0); |
| } |
| |
| inline UBool SkeletonFields::operator!=(const SkeletonFields& other) const { |
| return (! operator==(other)); |
| } |
| |
| class PtnSkeleton : public UMemory { |
| public: |
| int32_t type[UDATPG_FIELD_COUNT]; |
| SkeletonFields original; |
| SkeletonFields baseOriginal; |
| UBool addedDefaultDayPeriod; |
| |
| PtnSkeleton(); |
| PtnSkeleton(const PtnSkeleton& other); |
| void copyFrom(const PtnSkeleton& other); |
| void clear(); |
| UBool equals(const PtnSkeleton& other) const; |
| UnicodeString getSkeleton() const; |
| UnicodeString getBaseSkeleton() const; |
| UChar getFirstChar() const; |
| |
| // TODO: Why is this virtual, as well as the other destructors in this file? We don't want |
| // vtables when we don't use class objects polymorphically. |
| virtual ~PtnSkeleton(); |
| }; |
| |
| class PtnElem : public UMemory { |
| public: |
| UnicodeString basePattern; |
| LocalPointer<PtnSkeleton> skeleton; |
| UnicodeString pattern; |
| UBool skeletonWasSpecified; // if specified in availableFormats, not derived |
| LocalPointer<PtnElem> next; |
| |
| PtnElem(const UnicodeString &basePattern, const UnicodeString &pattern); |
| virtual ~PtnElem(); |
| }; |
| |
| class FormatParser : public UMemory { |
| public: |
| UnicodeString items[MAX_DT_TOKEN]; |
| int32_t itemNumber; |
| |
| FormatParser(); |
| virtual ~FormatParser(); |
| void set(const UnicodeString& patternString); |
| void getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex); |
| UBool isPatternSeparator(const UnicodeString& field) const; |
| static UBool isQuoteLiteral(const UnicodeString& s); |
| static int32_t getCanonicalIndex(const UnicodeString& s) { return getCanonicalIndex(s, true); } |
| static int32_t getCanonicalIndex(const UnicodeString& s, UBool strict); |
| |
| private: |
| typedef enum TokenStatus { |
| START, |
| ADD_TOKEN, |
| SYNTAX_ERROR, |
| DONE |
| } TokenStatus; |
| |
| TokenStatus status; |
| virtual TokenStatus setTokens(const UnicodeString& pattern, int32_t startPos, int32_t *len); |
| }; |
| |
| class DistanceInfo : public UMemory { |
| public: |
| int32_t missingFieldMask; |
| int32_t extraFieldMask; |
| |
| DistanceInfo() {} |
| virtual ~DistanceInfo(); |
| void clear() { missingFieldMask = extraFieldMask = 0; } |
| void setTo(const DistanceInfo& other); |
| void addMissing(int32_t field) { missingFieldMask |= (1<<field); } |
| void addExtra(int32_t field) { extraFieldMask |= (1<<field); } |
| }; |
| |
| class DateTimeMatcher: public UMemory { |
| public: |
| PtnSkeleton skeleton; |
| |
| void getBasePattern(UnicodeString& basePattern); |
| UnicodeString getPattern(); |
| void set(const UnicodeString& pattern, FormatParser* fp); |
| void set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeleton); |
| void copyFrom(const PtnSkeleton& skeleton); |
| void copyFrom(); |
| PtnSkeleton* getSkeletonPtr(); |
| UBool equals(const DateTimeMatcher* other) const; |
| int32_t getDistance(const DateTimeMatcher& other, int32_t includeMask, DistanceInfo& distanceInfo) const; |
| DateTimeMatcher(); |
| DateTimeMatcher(const DateTimeMatcher& other); |
| DateTimeMatcher& operator=(const DateTimeMatcher& other); |
| virtual ~DateTimeMatcher(); |
| int32_t getFieldMask() const; |
| }; |
| |
| class PatternMap : public UMemory { |
| public: |
| PtnElem *boot[MAX_PATTERN_ENTRIES]; |
| PatternMap(); |
| virtual ~PatternMap(); |
| void add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, const UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status); |
| const UnicodeString* getPatternFromBasePattern(const UnicodeString& basePattern, UBool& skeletonWasSpecified) const; |
| const UnicodeString* getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = 0) const; |
| void copyFrom(const PatternMap& other, UErrorCode& status); |
| PtnElem* getHeader(UChar baseChar) const; |
| UBool equals(const PatternMap& other) const; |
| private: |
| UBool isDupAllowed; |
| PtnElem* getDuplicateElem(const UnicodeString& basePattern, const PtnSkeleton& skeleton, PtnElem *baseElem); |
| }; // end PatternMap |
| |
| class PatternMapIterator : public UMemory { |
| public: |
| PatternMapIterator(UErrorCode &status); |
| virtual ~PatternMapIterator(); |
| void set(PatternMap& patternMap); |
| PtnSkeleton* getSkeleton() const; |
| UBool hasNext() const; |
| DateTimeMatcher& next(); |
| private: |
| int32_t bootIndex; |
| PtnElem *nodePtr; |
| LocalPointer<DateTimeMatcher> matcher; |
| PatternMap *patternMap; |
| }; |
| |
| class DTSkeletonEnumeration : public StringEnumeration { |
| public: |
| DTSkeletonEnumeration(PatternMap& patternMap, dtStrEnum type, UErrorCode& status); |
| virtual ~DTSkeletonEnumeration(); |
| static UClassID U_EXPORT2 getStaticClassID(void); |
| virtual UClassID getDynamicClassID(void) const; |
| virtual const UnicodeString* snext(UErrorCode& status); |
| virtual void reset(UErrorCode& status); |
| virtual int32_t count(UErrorCode& status) const; |
| private: |
| int32_t pos; |
| UBool isCanonicalItem(const UnicodeString& item); |
| LocalPointer<UVector> fSkeletons; |
| }; |
| |
| class DTRedundantEnumeration : public StringEnumeration { |
| public: |
| DTRedundantEnumeration(); |
| virtual ~DTRedundantEnumeration(); |
| static UClassID U_EXPORT2 getStaticClassID(void); |
| virtual UClassID getDynamicClassID(void) const; |
| virtual const UnicodeString* snext(UErrorCode& status); |
| virtual void reset(UErrorCode& status); |
| virtual int32_t count(UErrorCode& status) const; |
| void add(const UnicodeString &pattern, UErrorCode& status); |
| private: |
| int32_t pos; |
| UBool isCanonicalItem(const UnicodeString& item) const; |
| LocalPointer<UVector> fPatterns; |
| }; |
| |
| U_NAMESPACE_END |
| |
| #endif |