/** * Ensure that enough storage is available to store at least new_size * characters plus a null byte. In addition, if we currently share * the storage with another string, unshare it, so that we can safely * write to the storage. */ void String::ensureCapacity(uint32 new_size, bool keep_old) { bool isShared; uint32 curCapacity, newCapacity; char *newStorage; int *oldRefCount = _extern._refCount; if (isStorageIntern()) { isShared = false; curCapacity = _builtinCapacity; } else { isShared = (oldRefCount && *oldRefCount > 1); curCapacity = _extern._capacity; } // Special case: If there is enough space, and we do not share // the storage, then there is nothing to do. if (!isShared && new_size < curCapacity) return; if (isShared && new_size < _builtinCapacity) { // We share the storage, but there is enough internal storage: Use that. newStorage = _storage; newCapacity = _builtinCapacity; } else { // We need to allocate storage on the heap! // Compute a suitable new capacity limit newCapacity = MAX(curCapacity * 2, computeCapacity(new_size+1)); // Allocate new storage newStorage = new char[newCapacity]; assert(newStorage); } // Copy old data if needed, elsewise reset the new storage. if (keep_old) { assert(_size < newCapacity); memcpy(newStorage, _str, _size + 1); } else { _size = 0; newStorage[0] = 0; } // Release hold on the old storage ... decRefCount(oldRefCount); // ... in favor of the new storage _str = newStorage; if (!isStorageIntern()) { // Set the ref count & capacity if we use an external storage. // It is important to do this *after* copying any old content, // else we would override data that has not yet been copied! _extern._refCount = 0; _extern._capacity = newCapacity; } }
double LatticeTransportMaterial :: giveCharacteristicValue(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) { LatticeTransportMaterialStatus *status = static_cast< LatticeTransportMaterialStatus * >( this->giveStatus(gp) ); double suction = status->giveTempField().at(1); if ( mode == Capacity ) { return computeCapacity(suction, gp); } else if ( mode == Conductivity ) { return computeConductivity(suction, gp, tStep); } else { OOFEM_ERROR("unknown mode"); } return 0; // to make compiler happy }
void U32String::initWithCStr(const value_type *str, uint32 len) { assert(str); _storage[0] = 0; _size = len; if (len >= _builtinCapacity) { // Not enough internal storage, so allocate more _extern._capacity = computeCapacity(len + 1); _extern._refCount = nullptr; _str = new value_type[_extern._capacity]; assert(_str != nullptr); } // Copy the string into the storage area memmove(_str, str, len * sizeof(value_type)); _str[len] = 0; }
void U32String::initWithCStr(const char *str, uint32 len) { assert(str); _storage[0] = 0; _size = len; if (len >= _builtinCapacity) { // Not enough internal storage, so allocate more _extern._capacity = computeCapacity(len + 1); _extern._refCount = nullptr; _str = new value_type[_extern._capacity]; assert(_str != nullptr); } // Copy the string into the storage area for (size_t idx = 0; idx < len; ++idx, ++str) _str[idx] = *str; _str[len] = 0; }
void String::initWithCStr(const char *str, uint32 len) { assert(str); // Init _storage member explicitly (ie. without calling its constructor) // for GCC 2.95.x compatibility (see also tracker item #1602879). _storage[0] = 0; _size = len; if (len >= _builtinCapacity) { // Not enough internal storage, so allocate more _extern._capacity = computeCapacity(len+1); _extern._refCount = 0; _str = new char[_extern._capacity]; assert(_str != 0); } // Copy the string into the storage area memmove(_str, str, len); _str[len] = 0; }