node/deps/icu-small/source/i18n/messageformat2_allocation.h

148 lines
3.7 KiB
C++

// © 2024 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
#include "unicode/utypes.h"
#ifndef U_HIDE_DEPRECATED_API
#ifndef MESSAGEFORMAT2_UTILS_H
#define MESSAGEFORMAT2_UTILS_H
#if U_SHOW_CPLUSPLUS_API
#if !UCONFIG_NO_FORMATTING
#if !UCONFIG_NO_MF2
#include "unicode/unistr.h"
#include "uvector.h"
U_NAMESPACE_BEGIN
namespace message2 {
// Helpers
template<typename T>
static T* copyArray(const T* source, int32_t len, UErrorCode& status) {
if (U_FAILURE(status)) {
return nullptr;
}
U_ASSERT(source != nullptr);
U_ASSERT(len >= 0);
T* dest = new T[len];
if (dest == nullptr) {
status = U_MEMORY_ALLOCATION_ERROR;
} else {
for (int32_t i = 0; i < len; i++) {
dest[i] = source[i];
}
}
return dest;
}
template<typename T>
static T* copyVectorToArray(const UVector& source, UErrorCode& status) {
if (U_FAILURE(status)) {
return nullptr;
}
int32_t len = source.size();
T* dest = new T[len];
if (dest == nullptr) {
status = U_MEMORY_ALLOCATION_ERROR;
} else {
for (int32_t i = 0; i < len; i++) {
dest[i] = *(static_cast<T*>(source.elementAt(i)));
}
}
return dest;
}
template<typename T>
static T* moveVectorToArray(UVector& source, UErrorCode& status) {
if (U_FAILURE(status)) {
return nullptr;
}
int32_t len = source.size();
T* dest = new T[len];
if (dest == nullptr) {
status = U_MEMORY_ALLOCATION_ERROR;
} else {
for (int32_t i = 0; i < len; i++) {
dest[i] = std::move(*static_cast<T*>(source.elementAt(i)));
}
source.removeAllElements();
}
return dest;
}
inline UVector* createUVectorNoAdopt(UErrorCode& status) {
if (U_FAILURE(status)) {
return nullptr;
}
LocalPointer<UVector> result(new UVector(status));
if (U_FAILURE(status)) {
return nullptr;
}
return result.orphan();
}
inline UVector* createUVector(UErrorCode& status) {
UVector* result = createUVectorNoAdopt(status);
if (U_FAILURE(status)) {
return nullptr;
}
result->setDeleter(uprv_deleteUObject);
return result;
}
static UBool stringsEqual(const UElement s1, const UElement s2) {
return (*static_cast<UnicodeString*>(s1.pointer) == *static_cast<UnicodeString*>(s2.pointer));
}
inline UVector* createStringUVector(UErrorCode& status) {
UVector* v = createUVector(status);
if (U_FAILURE(status)) {
return nullptr;
}
v->setComparer(stringsEqual);
return v;
}
inline UVector* createStringVectorNoAdopt(UErrorCode& status) {
UVector* v = createUVectorNoAdopt(status);
if (U_FAILURE(status)) {
return nullptr;
}
v->setComparer(stringsEqual);
return v;
}
template<typename T>
inline T* create(T&& node, UErrorCode& status) {
if (U_FAILURE(status)) {
return nullptr;
}
T* result = new T(std::move(node));
if (result == nullptr) {
status = U_MEMORY_ALLOCATION_ERROR;
}
return result;
}
} // namespace message2
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_MF2 */
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif /* U_SHOW_CPLUSPLUS_API */
#endif // MESSAGEFORMAT2_UTILS_H
#endif // U_HIDE_DEPRECATED_API
// eof