]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/datefmt.cpp
ICU-57131.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / datefmt.cpp
index 7006e10317a8cc95cee09019b939040baf2c586a..4f7a1046ea01c2a58833039ba80775d593cdc45a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 1997-2014, International Business Machines Corporation and    *
+ * Copyright (C) 1997-2015, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  *
@@ -27,6 +27,9 @@
 #include "unicode/dtptngen.h"
 #include "unicode/udisplaycontext.h"
 #include "reldtfmt.h"
+#include "sharedobject.h"
+#include "unifiedcache.h"
+#include "uarrsort.h"
 
 #include "cstring.h"
 #include "windtfmt.h"
 
 U_NAMESPACE_BEGIN
 
+class U_I18N_API DateFmtBestPattern : public SharedObject {
+public:
+    UnicodeString fPattern;
+
+    DateFmtBestPattern(const UnicodeString &pattern)
+            : fPattern(pattern) { }
+    ~DateFmtBestPattern();
+};
+
+DateFmtBestPattern::~DateFmtBestPattern() {
+}
+
+template<> U_I18N_API
+const DateFmtBestPattern *LocaleCacheKey<DateFmtBestPattern>::createObject(
+        const void * /*creationContext*/, UErrorCode &status) const {
+    status = U_UNSUPPORTED_ERROR;
+    return NULL;
+}
+
+class U_I18N_API DateFmtBestPatternKey : public LocaleCacheKey<DateFmtBestPattern> { 
+private:
+    UnicodeString fSkeleton;
+public:
+    DateFmtBestPatternKey(
+        const Locale &loc,
+        const UnicodeString &skeleton,
+        UErrorCode &status)
+            : LocaleCacheKey<DateFmtBestPattern>(loc),
+              fSkeleton(DateTimePatternGenerator::staticGetSkeleton(skeleton, status)) { }
+    DateFmtBestPatternKey(const DateFmtBestPatternKey &other) :
+            LocaleCacheKey<DateFmtBestPattern>(other),
+            fSkeleton(other.fSkeleton) { }
+    virtual ~DateFmtBestPatternKey();
+    virtual int32_t hashCode() const {
+        return 37 * LocaleCacheKey<DateFmtBestPattern>::hashCode() + fSkeleton.hashCode();
+    }
+    virtual UBool operator==(const CacheKeyBase &other) const {
+       // reflexive
+       if (this == &other) {   
+           return TRUE;
+       }
+       if (!LocaleCacheKey<DateFmtBestPattern>::operator==(other)) {
+           return FALSE;
+       }
+       // We know that this and other are of same class if we get this far.
+       const DateFmtBestPatternKey &realOther =
+               static_cast<const DateFmtBestPatternKey &>(other);
+       return (realOther.fSkeleton == fSkeleton);
+    }
+    virtual CacheKeyBase *clone() const {
+        return new DateFmtBestPatternKey(*this);
+    }
+    virtual const DateFmtBestPattern *createObject(
+            const void * /*unused*/, UErrorCode &status) const {
+        LocalPointer<DateTimePatternGenerator> dtpg(
+                    DateTimePatternGenerator::createInstance(fLoc, status));
+        if (U_FAILURE(status)) {
+            return NULL;
+        }
+  
+        LocalPointer<DateFmtBestPattern> pattern(
+                new DateFmtBestPattern(
+                        dtpg->getBestPattern(fSkeleton, status)),
+                status);
+        if (U_FAILURE(status)) {
+            return NULL;
+        }
+        DateFmtBestPattern *result = pattern.orphan();
+        result->addRef();
+        return result;
+    }
+};
+
+DateFmtBestPatternKey::~DateFmtBestPatternKey() { }
+
+
 DateFormat::DateFormat()
 :   fCalendar(0),
     fNumberFormat(0),
@@ -345,6 +424,26 @@ DateFormat::createInstance()
 
 //----------------------------------------------------------------------
 
+UnicodeString U_EXPORT2
+DateFormat::getBestPattern(
+        const Locale &locale,
+        const UnicodeString &skeleton,
+        UErrorCode &status) {
+    UnifiedCache *cache = UnifiedCache::getInstance(status);
+    if (U_FAILURE(status)) {
+        return UnicodeString();
+    }
+    DateFmtBestPatternKey key(locale, skeleton, status);
+    const DateFmtBestPattern *patternPtr = NULL;
+    cache->get(key, patternPtr, status);
+    if (U_FAILURE(status)) {
+        return UnicodeString();
+    }
+    UnicodeString result(patternPtr->fPattern);
+    patternPtr->removeRef();
+    return result;
+}
+
 DateFormat* U_EXPORT2
 DateFormat::createInstanceForSkeleton(
         Calendar *calendarToAdopt,
@@ -372,13 +471,15 @@ DateFormat::createInstanceForSkeleton(
         const UnicodeString& skeleton,
         const Locale &locale,
         UErrorCode &status) {
-    LocalPointer<DateTimePatternGenerator> gen(
-            DateTimePatternGenerator::createInstance(locale, status));
     if (U_FAILURE(status)) {
         return NULL;
     }
-    return internalCreateInstanceForSkeleton(
-            skeleton, locale, *gen, status);
+    LocalPointer<DateFormat> df(
+        new SimpleDateFormat(
+            getBestPattern(locale, skeleton, status),
+            locale, status),
+        status);
+    return U_SUCCESS(status) ? df.orphan() : NULL;
 }
 
 DateFormat* U_EXPORT2
@@ -389,30 +490,6 @@ DateFormat::createInstanceForSkeleton(
             skeleton, Locale::getDefault(), status);
 }
 
-DateFormat* U_EXPORT2
-DateFormat::internalCreateInstanceForSkeleton(
-        const UnicodeString& skeleton,
-        const Locale &locale,
-        DateTimePatternGenerator &gen,
-        UErrorCode &status) {
-    if (U_FAILURE(status)) {
-        return NULL;
-    }
-    DateFormat *fmt = new SimpleDateFormat(
-               gen.getBestPattern(skeleton, status),
-               locale,
-               status);
-   if (fmt == NULL) {
-       status = U_MEMORY_ALLOCATION_ERROR;
-       return NULL;
-   }
-   if (U_FAILURE(status)) {
-       delete fmt;
-       return NULL;
-   }
-   return fmt;
-}
-
 //----------------------------------------------------------------------
 
 DateFormat* U_EXPORT2