| /* |
| ****************************************************************************** |
| * |
| * Copyright (C) 2010, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ****************************************************************************** |
| * |
| * File decnumstr.cpp |
| * |
| */ |
| |
| #include "unicode/utypes.h" |
| #include "decnumstr.h" |
| #include "cmemory.h" |
| #include "uassert.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| DecimalNumberString::DecimalNumberString() { |
| fLength = 0; |
| fText[0] = 0; |
| } |
| |
| DecimalNumberString::~DecimalNumberString() { |
| } |
| |
| DecimalNumberString::DecimalNumberString(const StringPiece &source, UErrorCode &status) { |
| fLength = 0; |
| fText[0] = 0; |
| append(source, status); |
| } |
| |
| DecimalNumberString & DecimalNumberString::append(char c, UErrorCode &status) { |
| if (ensureCapacity(fLength + 2, status) == FALSE) { |
| return *this; |
| } |
| fText[fLength++] = c; |
| fText[fLength] = 0; |
| return *this; |
| } |
| |
| DecimalNumberString &DecimalNumberString::append(const StringPiece &str, UErrorCode &status) { |
| int32_t sLength = str.length(); |
| if (ensureCapacity(fLength + sLength + 1, status) == FALSE) { |
| return *this; |
| } |
| uprv_memcpy(&fText[fLength], str.data(), sLength); |
| fLength += sLength; |
| fText[fLength] = 0; |
| return *this; |
| } |
| |
| char & DecimalNumberString::operator [] (int32_t index) { |
| U_ASSERT(index>=0 && index<fLength); |
| return fText[index]; |
| } |
| |
| const char & DecimalNumberString::operator [] (int32_t index) const { |
| U_ASSERT(index>=0 && index<fLength); |
| return fText[index]; |
| } |
| |
| int32_t DecimalNumberString::length() const { |
| return fLength; |
| } |
| |
| void DecimalNumberString::setLength(int32_t length, UErrorCode &status) { |
| if (ensureCapacity(length+1, status) == FALSE) { |
| return; |
| } |
| if (length > fLength) { |
| uprv_memset(&fText[fLength], length - fLength, 0); |
| } |
| fLength = length; |
| fText[fLength] = 0; |
| } |
| |
| DecimalNumberString::operator StringPiece() const { |
| return StringPiece(fText, fLength); |
| } |
| |
| UBool DecimalNumberString::ensureCapacity(int32_t neededSize, UErrorCode &status) { |
| if (U_FAILURE(status)) { |
| return FALSE; |
| } |
| if (fText.getCapacity() < neededSize) { |
| char *newBuf = fText.resize(neededSize, fText.getCapacity()); |
| if (newBuf == NULL) { |
| status = U_MEMORY_ALLOCATION_ERROR; |
| return FALSE; |
| } |
| U_ASSERT(fText.getCapacity() >= neededSize); |
| U_ASSERT(fText.getAlias() == newBuf); |
| } |
| return TRUE; |
| } |
| |
| U_NAMESPACE_END |
| |