// This file contains one implementation of FormattedValue. // Other independent implementations should go into their own cpp file for // better dependency modularization.
// Signal the end of the string using a field that doesn't exist and that is // different from kUndefinedField, which is used for "null field". static constexpr Field kEndField = Field(0xf, 0xf);
for (int32_t i = fString.fZero + cfpos.getLimit(); i <= fString.fZero + fString.fLength; i++) {
Field _field = (i < fString.fZero + fString.fLength) ? fString.getFieldPtr()[i] : kEndField; // Case 1: currently scanning a field. if (currField != kUndefinedField) { if (currField != _field) {
int32_t end = i - fString.fZero; // Grouping separators can be whitespace; don't throw them out! if (isTrimmable(currField)) {
end = trimBack(i - fString.fZero);
} if (end <= fieldStart) { // Entire field position is ignorable; skip.
fieldStart = -1;
currField = kUndefinedField;
i--; // look at this index again continue;
}
int32_t start = fieldStart; if (isTrimmable(currField)) {
start = trimFront(start);
}
cfpos.setState(currField.getCategory(), currField.getField(), start, end); returntrue;
} continue;
} // Special case: emit normalField if we are pointing at the end of spanField. if (i > fString.fZero && prevIsSpan) {
int64_t si = cfpos.getInt64IterationContext() - 1;
U_ASSERT(si >= 0);
int32_t previ = i - spanIndices[si].length;
U_ASSERT(previ >= fString.fZero);
Field prevField = fString.getFieldPtr()[previ]; if (prevField == Field(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)) { // Special handling for ULISTFMT_ELEMENT_FIELD if (cfpos.matchesField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)) {
fieldStart = i - fString.fZero - spanIndices[si].length;
int32_t end = fieldStart + spanIndices[si].length;
cfpos.setState(
UFIELD_CATEGORY_LIST,
ULISTFMT_ELEMENT_FIELD,
fieldStart,
end); returntrue;
} else {
prevIsSpan = false;
}
} else { // Re-wind, since there may be multiple fields in the span.
i = previ;
_field = prevField;
}
} // Special case: coalesce the INTEGER if we are pointing at the end of the INTEGER. if (cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD)
&& i > fString.fZero
&& !prevIsInteger
&& !prevIsNumeric
&& isIntOrGroup(fString.getFieldPtr()[i - 1])
&& !isIntOrGroup(_field)) { int j = i - 1; for (; j >= fString.fZero && isIntOrGroup(fString.getFieldPtr()[j]); j--) {}
cfpos.setState(
UFIELD_CATEGORY_NUMBER,
UNUM_INTEGER_FIELD,
j - fString.fZero + 1,
i - fString.fZero); returntrue;
} // Special case: coalesce NUMERIC if we are pointing at the end of the NUMERIC. if (numericField != kUndefinedField
&& cfpos.matchesField(numericField.getCategory(), numericField.getField())
&& i > fString.fZero
&& !prevIsNumeric
&& fString.getFieldPtr()[i - 1].isNumeric()
&& !_field.isNumeric()) { // Re-wind to the beginning of the field and then emit it
int32_t j = i - 1; for (; j >= fString.fZero && fString.getFieldPtr()[j].isNumeric(); j--) {}
cfpos.setState(
numericField.getCategory(),
numericField.getField(),
j - fString.fZero + 1,
i - fString.fZero); returntrue;
} // Check for span field if (!prevIsSpan && (
_field == Field(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD) ||
i - fString.fZero == nextSpanStart)) {
int64_t si = cfpos.getInt64IterationContext(); if (si >= spanIndicesCount) { break;
}
UFieldCategory spanCategory = spanIndices[si].category;
int32_t spanValue = spanIndices[si].spanValue;
int32_t length = spanIndices[si].length;
cfpos.setInt64IterationContext(si + 1); if (si + 1 < spanIndicesCount) {
nextSpanStart = spanIndices[si + 1].start;
} if (length == 0) { // ICU-21871: Don't return fields on empty spans
i--; continue;
} if (cfpos.matchesField(spanCategory, spanValue)) {
fieldStart = i - fString.fZero;
int32_t end = fieldStart + length;
cfpos.setState(
spanCategory,
spanValue,
fieldStart,
end); returntrue;
} elseif (_field == Field(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)) { // Special handling for ULISTFMT_ELEMENT_FIELD if (cfpos.matchesField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)) {
fieldStart = i - fString.fZero;
int32_t end = fieldStart + length;
cfpos.setState(
UFIELD_CATEGORY_LIST,
ULISTFMT_ELEMENT_FIELD,
fieldStart,
end); returntrue;
} else { // Failed to match; jump ahead
i += length - 1; // goto loopend
}
}
} // Special case: skip over INTEGER; will be coalesced later. elseif (_field == Field(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD)) {
_field = kUndefinedField;
} // No field starting at this position. elseif (_field.isUndefined() || _field == kEndField) { // goto loopend
} // No SpanField elseif (cfpos.matchesField(_field.getCategory(), _field.getField())) {
fieldStart = i - fString.fZero;
currField = _field;
} // loopend:
prevIsSpan = false;
prevIsNumeric = false;
prevIsInteger = false;
}
U_ASSERT(currField == kUndefinedField); // Always set the position to the end so that we don't revisit previous sections
cfpos.setState(
cfpos.getCategory(),
cfpos.getField(),
fString.fLength,
fString.fLength); returnfalse;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.