*/
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]);
}
}
}
}
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;
}
/**
* 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;