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.

233 lines
6.3 KiB

// © 2018 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 "unicode/formattedvalue.h"
#include "formattedval_impl.h"
#include "capi_helper.h"
U_NAMESPACE_BEGIN
ConstrainedFieldPosition::ConstrainedFieldPosition() {}
ConstrainedFieldPosition::~ConstrainedFieldPosition() {}
void ConstrainedFieldPosition::reset() {
fContext = 0LL;
fField = 0;
fStart = 0;
fLimit = 0;
fConstraint = UCFPOS_CONSTRAINT_NONE;
fCategory = UFIELD_CATEGORY_UNDEFINED;
}
void ConstrainedFieldPosition::constrainCategory(int32_t category) {
fConstraint = UCFPOS_CONSTRAINT_CATEGORY;
fCategory = category;
}
void ConstrainedFieldPosition::constrainField(int32_t category, int32_t field) {
fConstraint = UCFPOS_CONSTRAINT_FIELD;
fCategory = category;
fField = field;
}
void ConstrainedFieldPosition::setInt64IterationContext(int64_t context) {
fContext = context;
}
UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) const {
switch (fConstraint) {
case UCFPOS_CONSTRAINT_NONE:
return TRUE;
case UCFPOS_CONSTRAINT_CATEGORY:
return fCategory == category;
case UCFPOS_CONSTRAINT_FIELD:
return fCategory == category && fField == field;
default:
UPRV_UNREACHABLE;
}
}
void ConstrainedFieldPosition::setState(
int32_t category,
int32_t field,
int32_t start,
int32_t limit) {
fCategory = category;
fField = field;
fStart = start;
fLimit = limit;
}
FormattedValue::~FormattedValue() = default;
///////////////////////
/// C API FUNCTIONS ///
///////////////////////
struct UConstrainedFieldPositionImpl : public UMemory,
// Magic number as ASCII == "UCF"
public IcuCApiHelper<UConstrainedFieldPosition, UConstrainedFieldPositionImpl, 0x55434600> {
ConstrainedFieldPosition fImpl;
};
U_CAPI UConstrainedFieldPosition* U_EXPORT2
ucfpos_open(UErrorCode* ec) {
auto* impl = new UConstrainedFieldPositionImpl();
if (impl == nullptr) {
*ec = U_MEMORY_ALLOCATION_ERROR;
return nullptr;
}
return impl->exportForC();
}
U_CAPI void U_EXPORT2
ucfpos_reset(UConstrainedFieldPosition* ptr, UErrorCode* ec) {
auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return;
}
impl->fImpl.reset();
}
U_CAPI void U_EXPORT2
ucfpos_constrainCategory(UConstrainedFieldPosition* ptr, int32_t category, UErrorCode* ec) {
auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return;
}
impl->fImpl.constrainCategory(category);
}
U_CAPI void U_EXPORT2
ucfpos_constrainField(UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) {
auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return;
}
impl->fImpl.constrainField(category, field);
}
U_CAPI int32_t U_EXPORT2
ucfpos_getCategory(const UConstrainedFieldPosition* ptr, UErrorCode* ec) {
const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return UFIELD_CATEGORY_UNDEFINED;
}
return impl->fImpl.getCategory();
}
U_CAPI int32_t U_EXPORT2
ucfpos_getField(const UConstrainedFieldPosition* ptr, UErrorCode* ec) {
const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return 0;
}
return impl->fImpl.getField();
}
U_CAPI void U_EXPORT2
ucfpos_getIndexes(const UConstrainedFieldPosition* ptr, int32_t* pStart, int32_t* pLimit, UErrorCode* ec) {
const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return;
}
*pStart = impl->fImpl.getStart();
*pLimit = impl->fImpl.getLimit();
}
U_CAPI int64_t U_EXPORT2
ucfpos_getInt64IterationContext(const UConstrainedFieldPosition* ptr, UErrorCode* ec) {
const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return 0;
}
return impl->fImpl.getInt64IterationContext();
}
U_CAPI void U_EXPORT2
ucfpos_setInt64IterationContext(UConstrainedFieldPosition* ptr, int64_t context, UErrorCode* ec) {
auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return;
}
impl->fImpl.setInt64IterationContext(context);
}
U_CAPI UBool U_EXPORT2
ucfpos_matchesField(const UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) {
const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return 0;
}
return impl->fImpl.matchesField(category, field);
}
U_CAPI void U_EXPORT2
ucfpos_setState(
UConstrainedFieldPosition* ptr,
int32_t category,
int32_t field,
int32_t start,
int32_t limit,
UErrorCode* ec) {
auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec);
if (U_FAILURE(*ec)) {
return;
}
impl->fImpl.setState(category, field, start, limit);
}
U_CAPI void U_EXPORT2
ucfpos_close(UConstrainedFieldPosition* ptr) {
UErrorCode localStatus = U_ZERO_ERROR;
auto* impl = UConstrainedFieldPositionImpl::validate(ptr, localStatus);
delete impl;
}
U_CAPI const UChar* U_EXPORT2
ufmtval_getString(
const UFormattedValue* ufmtval,
int32_t* pLength,
UErrorCode* ec) {
const auto* impl = UFormattedValueApiHelper::validate(ufmtval, *ec);
if (U_FAILURE(*ec)) {
return nullptr;
}
UnicodeString readOnlyAlias = impl->fFormattedValue->toTempString(*ec);
if (U_FAILURE(*ec)) {
return nullptr;
}
if (pLength != nullptr) {
*pLength = readOnlyAlias.length();
}
return readOnlyAlias.getBuffer();
}
U_CAPI UBool U_EXPORT2
ufmtval_nextPosition(
const UFormattedValue* ufmtval,
UConstrainedFieldPosition* ucfpos,
UErrorCode* ec) {
const auto* fmtval = UFormattedValueApiHelper::validate(ufmtval, *ec);
auto* cfpos = UConstrainedFieldPositionImpl::validate(ucfpos, *ec);
if (U_FAILURE(*ec)) {
return FALSE;
}
return fmtval->fFormattedValue->nextPosition(cfpos->fImpl, *ec);
}
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */