return gSimpleUnitCategories[index];
}
-MeasureUnitImpl::MeasureUnitImpl(const MeasureUnitImpl &other, UErrorCode &status) {
- *this = other.copy(status);
-}
-
MeasureUnitImpl::MeasureUnitImpl(const SingleUnitImpl &singleUnit, UErrorCode &status) {
this->appendSingleUnit(singleUnit, status);
}
MaybeStackVector<MeasureUnitImplWithIndex> result;
if (this->complexity != UMeasureUnitComplexity::UMEASURE_UNIT_MIXED) {
- result.emplaceBackAndCheckErrorCode(status, 0, new MeasureUnitImpl(*this, status));
+ result.emplaceBackAndCheckErrorCode(status, 0, *this, status);
return result;
}
for (int32_t i = 0; i < singleUnits.length(); ++i) {
- result.emplaceBackAndCheckErrorCode(status, i, new MeasureUnitImpl(*singleUnits[i], status));
+ result.emplaceBackAndCheckErrorCode(status, i, *singleUnits[i], status);
if (U_FAILURE(status)) {
return result;
}
static const char16_t kDefaultCurrency[] = u"XXX";
static const char kDefaultCurrency8[] = "XXX";
-struct U_I18N_API MeasureUnitImplWithIndex : public UMemory {
- const int32_t index;
- LocalPointer<MeasureUnitImpl> unitImpl;
- // Takes ownership of unitImpl.
- MeasureUnitImplWithIndex(int32_t index, MeasureUnitImpl *unitImpl)
- : index(index), unitImpl(unitImpl) {}
-};
-
/**
* Looks up the "unitQuantity" (aka "type" or "category") of a base unit
* identifier. The category is returned via `result`, which must initially be
int32_t dimensionality = 1;
};
+// Forward declaration
+struct MeasureUnitImplWithIndex;
+
// Export explicit template instantiations of MaybeStackArray, MemoryPool and
// MaybeStackVector. This is required when building DLLs for Windows. (See
// datefmt.h, collationiterator.h, erarules.h and others for similar examples.)
public:
MeasureUnitImpl() = default;
MeasureUnitImpl(MeasureUnitImpl &&other) = default;
- MeasureUnitImpl(const MeasureUnitImpl &other, UErrorCode &status);
+ // No copy constructor, use MeasureUnitImpl::copy() to make it explicit.
+ MeasureUnitImpl(const MeasureUnitImpl &other, UErrorCode &status) = delete;
MeasureUnitImpl(const SingleUnitImpl &singleUnit, UErrorCode &status);
MeasureUnitImpl &operator=(MeasureUnitImpl &&other) noexcept = default;
friend class number::impl::LongNameHandler;
};
+struct U_I18N_API MeasureUnitImplWithIndex : public UMemory {
+ const int32_t index;
+ MeasureUnitImpl unitImpl;
+ // Makes a copy of unitImpl.
+ MeasureUnitImplWithIndex(int32_t index, const MeasureUnitImpl &unitImpl, UErrorCode &status)
+ : index(index), unitImpl(unitImpl.copy(status)) {
+ }
+ MeasureUnitImplWithIndex(int32_t index, const SingleUnitImpl &singleUnitImpl, UErrorCode &status)
+ : index(index), unitImpl(MeasureUnitImpl(singleUnitImpl, status)) {
+ }
+};
+
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
U_ASSERT(units_.length() != 0);
// Just borrowing a pointer to the instance
- MeasureUnitImpl *biggestUnit = units_[0]->unitImpl.getAlias();
+ MeasureUnitImpl *biggestUnit = &units_[0]->unitImpl;
for (int32_t i = 1; i < units_.length(); i++) {
- if (UnitsConverter::compareTwoUnits(*units_[i]->unitImpl, *biggestUnit, ratesInfo, status) > 0 &&
+ if (UnitsConverter::compareTwoUnits(units_[i]->unitImpl, *biggestUnit, ratesInfo, status) > 0 &&
U_SUCCESS(status)) {
- biggestUnit = units_[i]->unitImpl.getAlias();
+ biggestUnit = &units_[i]->unitImpl;
}
if (U_FAILURE(status)) {
const auto *rightPointer = static_cast<const MeasureUnitImplWithIndex *const *>(right);
// Multiply by -1 to sort in descending order
- return (-1) * UnitsConverter::compareTwoUnits(*((**leftPointer).unitImpl) /* left unit*/, //
- *((**rightPointer).unitImpl) /* right unit */, //
- *static_cast<const ConversionRates *>(context), //
- status);
+ return (-1) * UnitsConverter::compareTwoUnits((**leftPointer).unitImpl, //
+ (**rightPointer).unitImpl, //
+ *static_cast<const ConversionRates *>(context), //
+ status);
};
uprv_sortArray(units_.getAlias(), //
// 3. then, the final result will be (6 feet and 6.74016 inches)
for (int i = 0, n = units_.length(); i < n; i++) {
if (i == 0) { // first element
- unitsConverters_.emplaceBackAndCheckErrorCode(status, inputUnit, *(units_[i]->unitImpl),
- ratesInfo, status);
+ unitsConverters_.emplaceBackAndCheckErrorCode(status, inputUnit, units_[i]->unitImpl,
+ ratesInfo, status);
} else {
- unitsConverters_.emplaceBackAndCheckErrorCode(status, *(units_[i - 1]->unitImpl),
- *(units_[i]->unitImpl), ratesInfo, status);
+ unitsConverters_.emplaceBackAndCheckErrorCode(status, units_[i - 1]->unitImpl,
+ units_[i]->unitImpl, ratesInfo, status);
}
if (U_FAILURE(status)) {
if (i < n - 1) {
Formattable formattableQuantity(intValues[i] * sign);
// Measure takes ownership of the MeasureUnit*
- MeasureUnit *type = new MeasureUnit(units_[i]->unitImpl->copy(status).build(status));
+ MeasureUnit *type = new MeasureUnit(units_[i]->unitImpl.copy(status).build(status));
tmpResult[units_[i]->index] = new Measure(formattableQuantity, type, status);
} else { // LAST ELEMENT
Formattable formattableQuantity(quantity * sign);
// Measure takes ownership of the MeasureUnit*
- MeasureUnit *type = new MeasureUnit(units_[i]->unitImpl->copy(status).build(status));
+ MeasureUnit *type = new MeasureUnit(units_[i]->unitImpl.copy(status).build(status));
tmpResult[units_[i]->index] = new Measure(formattableQuantity, type, status);
}
}