Index: source/i18n/dtptngen_impl.h |
diff --git a/source/i18n/dtptngen_impl.h b/source/i18n/dtptngen_impl.h |
index ec9fb00dfd6e6558e62bcc44502a603147432dcc..00a707585b7a5ba612b9b329d09bbb7ebcc02df0 100644 |
--- a/source/i18n/dtptngen_impl.h |
+++ b/source/i18n/dtptngen_impl.h |
@@ -1,7 +1,9 @@ |
+// Copyright (C) 2016 and later: Unicode, Inc. and others. |
+// License & terms of use: http://www.unicode.org/copyright.html |
/* |
******************************************************************************* |
-* Copyright (C) 2007-2015, International Business Machines Corporation and |
-* others. All Rights Reserved. * |
+* Copyright (C) 2007-2016, International Business Machines Corporation and |
+* others. All Rights Reserved. |
******************************************************************************* |
* |
* File DTPTNGEN.H |
@@ -9,11 +11,12 @@ |
******************************************************************************* |
*/ |
-#include "uvector.h" |
- |
#ifndef __DTPTNGEN_IMPL_H__ |
#define __DTPTNGEN_IMPL_H__ |
+#include "unicode/udatpg.h" |
+#include "uvector.h" |
+ |
// TODO(claireho): Split off Builder class. |
// TODO(claireho): If splitting off Builder class: As subclass or independent? |
@@ -38,6 +41,7 @@ |
#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) |
@@ -60,6 +64,7 @@ |
#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) |
@@ -109,17 +114,56 @@ typedef struct dtTypeElem { |
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]; |
- UnicodeString original[UDATPG_FIELD_COUNT]; |
- UnicodeString baseOriginal[UDATPG_FIELD_COUNT]; |
+ SkeletonFields original; |
+ SkeletonFields baseOriginal; |
PtnSkeleton(); |
PtnSkeleton(const PtnSkeleton& other); |
- UBool equals(const PtnSkeleton& other); |
- UnicodeString getSkeleton(); |
- UnicodeString getBaseSkeleton(); |
+ 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(); |
}; |
@@ -180,7 +224,7 @@ class DateTimeMatcher: public UMemory { |
public: |
PtnSkeleton skeleton; |
- void getBasePattern(UnicodeString &basePattern); |
+ void getBasePattern(UnicodeString& basePattern); |
UnicodeString getPattern(); |
void set(const UnicodeString& pattern, FormatParser* fp); |
void set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeleton); |