You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.0 KiB
132 lines
3.0 KiB
// © 2020 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
|
|
#include "unicode/utypes.h"
|
|
|
|
#if !UCONFIG_NO_FORMATTING
|
|
|
|
#include "number_microprops.h"
|
|
#include "unicode/numberformatter.h"
|
|
|
|
using namespace icu;
|
|
using namespace icu::number;
|
|
using namespace icu::number::impl;
|
|
|
|
SymbolsWrapper::SymbolsWrapper(const SymbolsWrapper &other) {
|
|
doCopyFrom(other);
|
|
}
|
|
|
|
SymbolsWrapper::SymbolsWrapper(SymbolsWrapper &&src) U_NOEXCEPT {
|
|
doMoveFrom(std::move(src));
|
|
}
|
|
|
|
SymbolsWrapper &SymbolsWrapper::operator=(const SymbolsWrapper &other) {
|
|
if (this == &other) {
|
|
return *this;
|
|
}
|
|
doCleanup();
|
|
doCopyFrom(other);
|
|
return *this;
|
|
}
|
|
|
|
SymbolsWrapper &SymbolsWrapper::operator=(SymbolsWrapper &&src) U_NOEXCEPT {
|
|
if (this == &src) {
|
|
return *this;
|
|
}
|
|
doCleanup();
|
|
doMoveFrom(std::move(src));
|
|
return *this;
|
|
}
|
|
|
|
SymbolsWrapper::~SymbolsWrapper() {
|
|
doCleanup();
|
|
}
|
|
|
|
void SymbolsWrapper::setTo(const DecimalFormatSymbols &dfs) {
|
|
doCleanup();
|
|
fType = SYMPTR_DFS;
|
|
fPtr.dfs = new DecimalFormatSymbols(dfs);
|
|
}
|
|
|
|
void SymbolsWrapper::setTo(const NumberingSystem *ns) {
|
|
doCleanup();
|
|
fType = SYMPTR_NS;
|
|
fPtr.ns = ns;
|
|
}
|
|
|
|
void SymbolsWrapper::doCopyFrom(const SymbolsWrapper &other) {
|
|
fType = other.fType;
|
|
switch (fType) {
|
|
case SYMPTR_NONE:
|
|
// No action necessary
|
|
break;
|
|
case SYMPTR_DFS:
|
|
// Memory allocation failures are exposed in copyErrorTo()
|
|
if (other.fPtr.dfs != nullptr) {
|
|
fPtr.dfs = new DecimalFormatSymbols(*other.fPtr.dfs);
|
|
} else {
|
|
fPtr.dfs = nullptr;
|
|
}
|
|
break;
|
|
case SYMPTR_NS:
|
|
// Memory allocation failures are exposed in copyErrorTo()
|
|
if (other.fPtr.ns != nullptr) {
|
|
fPtr.ns = new NumberingSystem(*other.fPtr.ns);
|
|
} else {
|
|
fPtr.ns = nullptr;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SymbolsWrapper::doMoveFrom(SymbolsWrapper &&src) {
|
|
fType = src.fType;
|
|
switch (fType) {
|
|
case SYMPTR_NONE:
|
|
// No action necessary
|
|
break;
|
|
case SYMPTR_DFS:
|
|
fPtr.dfs = src.fPtr.dfs;
|
|
src.fPtr.dfs = nullptr;
|
|
break;
|
|
case SYMPTR_NS:
|
|
fPtr.ns = src.fPtr.ns;
|
|
src.fPtr.ns = nullptr;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SymbolsWrapper::doCleanup() {
|
|
switch (fType) {
|
|
case SYMPTR_NONE:
|
|
// No action necessary
|
|
break;
|
|
case SYMPTR_DFS:
|
|
delete fPtr.dfs;
|
|
break;
|
|
case SYMPTR_NS:
|
|
delete fPtr.ns;
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool SymbolsWrapper::isDecimalFormatSymbols() const {
|
|
return fType == SYMPTR_DFS;
|
|
}
|
|
|
|
bool SymbolsWrapper::isNumberingSystem() const {
|
|
return fType == SYMPTR_NS;
|
|
}
|
|
|
|
const DecimalFormatSymbols *SymbolsWrapper::getDecimalFormatSymbols() const {
|
|
U_ASSERT(fType == SYMPTR_DFS);
|
|
return fPtr.dfs;
|
|
}
|
|
|
|
const NumberingSystem *SymbolsWrapper::getNumberingSystem() const {
|
|
U_ASSERT(fType == SYMPTR_NS);
|
|
return fPtr.ns;
|
|
}
|
|
|
|
#endif /* #if !UCONFIG_NO_FORMATTING */
|