]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/uvector.cpp
ICU-400.42.tar.gz
[apple/icu.git] / icuSources / common / uvector.cpp
index ca76a7092a228a699ef59ccbb52caa343c660c98..2c9efbc20845c7a667e2a41671da69687897c75b 100644 (file)
@@ -93,12 +93,14 @@ UVector::~UVector() {
  */
 void UVector::assign(const UVector& other, UTokenAssigner *assign, UErrorCode &ec) {
     if (ensureCapacity(other.count, ec)) {
-        setSize(other.count);
-        for (int32_t i=0; i<other.count; ++i) {
-            if (elements[i].pointer != 0 && deleter != 0) {
-                (*deleter)(elements[i].pointer);
+        setSize(other.count, ec);
+        if (U_SUCCESS(ec)) {
+            for (int32_t i=0; i<other.count; ++i) {
+                if (elements[i].pointer != 0 && deleter != 0) {
+                    (*deleter)(elements[i].pointer);
+                }
+                (*assign)(&elements[i], &other.elements[i]);
             }
-            (*assign)(&elements[i], &other.elements[i]);
         }
     }
 }
@@ -323,24 +325,21 @@ int32_t UVector::indexOf(UHashTok key, int32_t startIndex, int8_t hint) const {
 }
 
 UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
-    if (capacity >= minimumCapacity) {
-        return TRUE;
-    } else {
+    if (capacity < minimumCapacity) {
         int32_t newCap = capacity * 2;
         if (newCap < minimumCapacity) {
             newCap = minimumCapacity;
         }
-        UHashTok* newElems = (UHashTok *)uprv_malloc(sizeof(UHashTok)*newCap);
-        if (newElems == 0) {
+        UHashTok* newElems = (UHashTok *)uprv_realloc(elements, sizeof(UHashTok)*newCap);
+        if (newElems == NULL) {
+            // We keep the original contents on the memory failure on realloc.
             status = U_MEMORY_ALLOCATION_ERROR;
             return FALSE;
         }
-        uprv_memcpy(newElems, elements, sizeof(elements[0]) * count);
-        uprv_free(elements);
         elements = newElems;
         capacity = newCap;
-        return TRUE;
     }
+    return TRUE;
 }
 
 /**
@@ -349,14 +348,13 @@ UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
  * newSize.  If newSize is larger, grow the array, filling in new
  * slots with NULL.
  */
-void UVector::setSize(int32_t newSize) {
+void UVector::setSize(int32_t newSize, UErrorCode &status) {
     int32_t i;
     if (newSize < 0) {
         return;
     }
     if (newSize > count) {
-        UErrorCode ec = U_ZERO_ERROR;
-        if (!ensureCapacity(newSize, ec)) {
+        if (!ensureCapacity(newSize, status)) {
             return;
         }
         UHashTok empty;
@@ -468,52 +466,5 @@ void UVector::sortedInsert(UHashTok tok, USortComparator *compare, UErrorCode& e
     }
 }
 
-UStack::UStack(UErrorCode &status) :
-    UVector(status)
-{
-}
-
-UStack::UStack(int32_t initialCapacity, UErrorCode &status) :
-    UVector(initialCapacity, status)
-{
-}
-
-UStack::UStack(UObjectDeleter *d, UKeyComparator *c, UErrorCode &status) :
-    UVector(d, c, status)
-{
-}
-
-UStack::UStack(UObjectDeleter *d, UKeyComparator *c, int32_t initialCapacity, UErrorCode &status) :
-    UVector(d, c, initialCapacity, status)
-{
-}
-
-UStack::~UStack() {}
-
-void* UStack::pop(void) {
-    int32_t n = size() - 1;
-    void* result = 0;
-    if (n >= 0) {
-        result = elementAt(n);
-        removeElementAt(n);
-    }
-    return result;
-}
-
-int32_t UStack::popi(void) {
-    int32_t n = size() - 1;
-    int32_t result = 0;
-    if (n >= 0) {
-        result = elementAti(n);
-        removeElementAt(n);
-    }
-    return result;
-}
-
-int32_t UStack::search(void* obj) const {
-    int32_t i = indexOf(obj);
-    return (i >= 0) ? size() - i : i;
-}
-
 U_NAMESPACE_END