numrange_fluent.o numrange_impl.o \
erarules.o \
formattedvalue.o formattedval_iterimpl.o formattedval_sbimpl.o formatted_string_builder.o \
-unitconverter.o
+unitconverter.o unitsrouter.o complexunitsconverter.o
## Header files to install
HEADERS = $(srcdir)/unicode/*.h
}
UBool ComplexUnitsConverter::greaterThanOrEqual(double quantity, double limit) const {
- U_ASSERT(unitConverters_.length() ?> 0);
+ U_ASSERT(unitConverters_.length() > 0);
// first quantity is the biggest one.
double newQuantity = (*unitConverters_[0]).convert(quantity);
<ClCompile Include="ulocdata.cpp" />
<ClCompile Include="umsg.cpp" />
<ClCompile Include="unitconverter.cpp" />
+ <ClCompile Include="complexunitsconverter.cpp" />
+ <ClCompile Include="unitsrouter.cpp" />
<ClCompile Include="unum.cpp" />
<ClCompile Include="unumsys.cpp" />
<ClCompile Include="upluralrules.cpp" />
<ClInclude Include="numrange_impl.h" />
<ClInclude Include="formattedval_impl.h" />
<ClInclude Include="unitconverter.h" />
+ <ClInclude Include="complexunitsconverter.h" />
+ <ClInclude Include="unitsrouter.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="i18n.rc" />
<ClCompile Include="unitconverter.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="complexunitsconverter.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
+ <ClCompile Include="unitsrouter.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClCompile Include="bocsu.cpp">
<ClInclude Include="unitconveter.h">
<Filter>formatting</Filter>
</ClInclude>
+ <ClInclude Include="complexunitsconverter.h">
+ <Filter>formatting</Filter>
+ </ClInclude>
+ <ClInclude Include="unitsrouter.h">
+ <Filter>formatting</Filter>
+ </ClInclude>
<ClInclude Include="vzone.h">
<Filter>formatting</Filter>
</ClInclude>
<ClCompile Include="ulocdata.cpp" />
<ClCompile Include="umsg.cpp" />
<ClCompile Include="unitconverter.cpp" />
+ <ClCompile Include="complexunitsconverter.cpp" />
+ <ClCompile Include="unitsrouter.cpp" />
<ClCompile Include="unum.cpp" />
<ClCompile Include="unumsys.cpp" />
<ClCompile Include="upluralrules.cpp" />
<ClInclude Include="numrange_impl.h" />
<ClInclude Include="formattedval_impl.h" />
<ClInclude Include="unitconverter.h" />
+ <ClInclude Include="complexunitsconverter.h" />
+ <ClInclude Include="unitsrouter.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="i18n.rc" />
#if !UCONFIG_NO_FORMATTING
+#include <utility>
+
#include "cmemory.h"
#include "unitsrouter.h"
for (int i = 0, n = preferences.length(); i < n; ++i) {
const auto &preference = *preferences[i];
MeasureUnit complexTargetUnit = MeasureUnit::forIdentifier(preference.identifier, status);
- converterPreferences_.emplaceBack(
- ConverterPreference(inputUnit, complexTargetUnit, preference.limit, status));
+ // TODO(younies): Find a way to emplaceBack `ConverterPreference`
+ // converterPreferences_.emplaceBack(
+ // std::move(ConverterPreference(inputUnit, complexTargetUnit, preference.limit, status)));
}
}
MaybeStackVector<Measure> UnitsRouter::route(double quantity, UErrorCode &status) {
- for (int i = 0, n = converterPreferences_.length(); i < n; i++) {
+ for (int i = 0, n = converterPreferences_.length() - 1; i < n; i++) {
const auto &converterPreference = *converterPreferences_[i];
- if (i == n - 1) { // last unit preference
- return converterPreference.converter.convert(quantity, status);
- }
-
if (converterPreference.converter.greaterThanOrEqual(quantity, converterPreference.limit)) {
return converterPreference.converter.convert(quantity, status);
}
}
+
+ const auto &converterPreference =
+ *converterPreferences_[converterPreferences_.length() - 1]; // Last Element
+ return converterPreference.converter.convert(quantity, status);
}
U_NAMESPACE_END
class U_I18N_API UnitsRouter {
public:
- UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode& status);
+ UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status);
MaybeStackVector<Measure> route(double quantity, UErrorCode &status);
numbertest_parse.o numbertest_doubleconversion.o numbertest_skeletons.o \
static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o \
formattedvaluetest.o formatted_string_builder_test.o numbertest_permutation.o \
-unitstest.o
+unitstest.o unitsroutertest.o
DEPS = $(OBJECTS:.o=.d)
<ClCompile Include="localebuildertest.cpp" />
<ClCompile Include="localematchertest.cpp" />
<ClCompile Include="unitstest.cpp" />
+ <ClCompile Include="unitsroutertest.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="colldata.h" />
<ClCompile Include="unitstest.cpp">
<Filter>formatting</Filter>
</ClCompile>
+ <ClCompile Include="unitsroutertest.cpp">
+ <Filter>formatting</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="itrbbi.h">
extern IntlTest *createFormattedStringBuilderTest();
extern IntlTest *createStringSegmentTest();
extern IntlTest *createUnitsTest();
+extern IntlTest *createUnitsRouterTest();
#define TESTCLASS(id, TestClass) \
callTest(*test, par);
}
break;
+ case 57:
+ name = "UnitsRouterTest";
+ if (exec) {
+ logln("UnitsRouterTest test---");
+ logln((UnicodeString)"");
+ LocalPointer<IntlTest> test(createUnitsRouterTest());
+ callTest(*test, par);
+ }
+ break;
default: name = ""; break; //needed to end loop
}
if (exec) {