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