]> granicus.if.org Git - icu/commitdiff
ICU-20202 Replace UVector with MemoryPool in CalendarDataSink.
authorFredrik Roubert <roubert@google.com>
Mon, 29 Oct 2018 21:29:12 +0000 (22:29 +0100)
committerFredrik Roubert <fredrik@roubert.name>
Tue, 30 Oct 2018 16:01:10 +0000 (17:01 +0100)
CalendarDataSink doesn't use any of the additional functionality
provided by UVector, it just needs a simple way to keep track of
allocated objects to delete them after it's done using them.

icu4c/source/i18n/dtfmtsym.cpp

index ab61cf4236288208c7d881f1ffaddc0c336d2058..aba37600887f522c1151981c076ed53169ad6902 100644 (file)
@@ -1500,7 +1500,7 @@ struct CalendarDataSink : public ResourceSink {
      * To avoid double deletion, 'maps' won't take ownership of the objects. Instead,
      * 'mapRefs' will own them and will delete them when CalendarDataSink is deleted.
      */
-    UVector mapRefs;
+    MemoryPool<Hashtable> mapRefs;
 
     // Paths and the aliases they point to
     UVector aliasPathPairs;
@@ -1518,7 +1518,7 @@ struct CalendarDataSink : public ResourceSink {
     // Initializes CalendarDataSink with default values
     CalendarDataSink(UErrorCode& status)
     :   arrays(FALSE, status), arraySizes(FALSE, status), maps(FALSE, status),
-        mapRefs(deleteHashtable, NULL, 10, status),
+        mapRefs(),
         aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status),
         currentCalendarType(), nextCalendarType(),
         resourcesToVisit(NULL), aliasRelativePath() {
@@ -1688,14 +1688,14 @@ struct CalendarDataSink : public ResourceSink {
             if (value.getType() == URES_STRING) {
                 // We are on a leaf, store the map elements into the stringMap
                 if (i == 0) {
-                    LocalPointer<Hashtable> stringMapPtr(new Hashtable(FALSE, errorCode), errorCode);
-                    stringMap = stringMapPtr.getAlias();
+                    // mapRefs will keep ownership of 'stringMap':
+                    stringMap = mapRefs.create(FALSE, errorCode);
+                    if (stringMap == NULL) {
+                        errorCode = U_MEMORY_ALLOCATION_ERROR;
+                        return;
+                    }
                     maps.put(path, stringMap, errorCode);
-                    // mapRefs will take ownership of 'stringMap':
-                    mapRefs.addElement(stringMap, errorCode);
                     if (U_FAILURE(errorCode)) { return; }
-                    // Only release ownership after mapRefs takes it (no error happened):
-                    stringMapPtr.orphan();
                     stringMap->setValueDeleter(uprv_deleteUObject);
                 }
                 U_ASSERT(stringMap != NULL);
@@ -1839,11 +1839,6 @@ struct CalendarDataSink : public ResourceSink {
     static void U_CALLCONV deleteUnicodeStringArray(void *uArray) {
         delete[] static_cast<UnicodeString *>(uArray);
     }
-
-    // Deleter function to be used by 'maps'
-    static void U_CALLCONV deleteHashtable(void *table) {
-        delete static_cast<Hashtable *>(table);
-    }
 };
 // Virtual destructors have to be defined out of line
 CalendarDataSink::~CalendarDataSink() {