From f7aafa00e27d85f4d0f2b4c504d9063d392b41f8 Mon Sep 17 00:00:00 2001 From: Ilya Grechuhin Date: Wed, 6 Jul 2016 13:49:16 +0300 Subject: [omim] Refactored measurement_utils. --- platform/measurement_utils.cpp | 67 ++++++++++++++++----------- platform/measurement_utils.hpp | 28 ++++++++--- platform/platform_android.cpp | 11 +++-- platform/platform_ios.mm | 9 ++-- platform/platform_qt.cpp | 10 ++-- platform/platform_tests/measurement_tests.cpp | 46 +++++++++++++++--- platform/settings.cpp | 19 ++++---- platform/settings.hpp | 5 -- 8 files changed, 126 insertions(+), 69 deletions(-) (limited to 'platform') diff --git a/platform/measurement_utils.cpp b/platform/measurement_utils.cpp index 71d1cbd200..dab1349b6c 100644 --- a/platform/measurement_utils.cpp +++ b/platform/measurement_utils.cpp @@ -16,7 +16,7 @@ using namespace settings; using namespace strings; -namespace MeasurementUtils +namespace measurement_utils { string ToStringPrecision(double d, int pr) @@ -51,14 +51,14 @@ bool FormatDistanceImpl(double m, string & res, bool FormatDistance(double m, string & res) { - Units u = Metric; - (void)Get(settings::kMeasurementUnits, u); + auto units = Units::Metric; + UNUSED_VALUE(Get(settings::kMeasurementUnits, units)); /// @todo Put string units resources. - switch (u) + switch (units) { - case Foot: return FormatDistanceImpl(m, res, " mi", " ft", 1609.344, 0.3048); - default: return FormatDistanceImpl(m, res, " km", " m", 1000.0, 1.0); + case Units::Imperial: return FormatDistanceImpl(m, res, " mi", " ft", 1609.344, 0.3048); + case Units::Metric: return FormatDistanceImpl(m, res, " km", " m", 1000.0, 1.0); } } @@ -154,42 +154,53 @@ void FormatMercator(m2::PointD const & mercator, string & lat, string & lon, int string FormatAltitude(double altitudeInMeters) { - Units u = Metric; - (void)Get(settings::kMeasurementUnits, u); + Units units = Units::Metric; + UNUSED_VALUE(Get(settings::kMeasurementUnits, units)); ostringstream ss; ss << fixed << setprecision(0); /// @todo Put string units resources. - switch (u) + switch (units) { - case Foot: ss << MetersToFeet(altitudeInMeters) << "ft"; break; - default: ss << altitudeInMeters << "m"; break; + case Units::Imperial: ss << MetersToFeet(altitudeInMeters) << "ft"; break; + case Units::Metric: ss << altitudeInMeters << "m"; break; } return ss.str(); } -string FormatSpeed(double metersPerSecond) +string FormatSpeedWithDeviceUnits(double metersPerSecond) { - Units u = Metric; - (void)Get(settings::kMeasurementUnits, u); + auto units = Units::Metric; + UNUSED_VALUE(Get(settings::kMeasurementUnits, units)); + return FormatSpeedWithUnits(metersPerSecond, units); +} - double perHour; - string res; +string FormatSpeedWithUnits(double metersPerSecond, Units units) +{ + return FormatSpeed(metersPerSecond, units) + FormatSpeedUnits(units); +} - /// @todo Put string units resources. - switch (u) +string FormatSpeed(double metersPerSecond, Units units) +{ + double constexpr kSecondsPerHour = 3600; + double constexpr metersPerKilometer = 1000; + double unitsPerHour; + switch (units) { - case Foot: - perHour = metersPerSecond * 3600. / 1609.344; - res = ToStringPrecision(perHour, perHour >= 10.0 ? 0 : 1) + "mph"; - break; - default: - perHour = metersPerSecond * 3600. / 1000.; - res = ToStringPrecision(perHour, perHour >= 10.0 ? 0 : 1) + "km/h"; - break; + case Units::Imperial: unitsPerHour = MetersToMiles(metersPerSecond) * kSecondsPerHour; break; + case Units::Metric: unitsPerHour = metersPerSecond * kSecondsPerHour / metersPerKilometer; break; + } + return ToStringPrecision(unitsPerHour, unitsPerHour >= 10.0 ? 0 : 1); +} + +string FormatSpeedUnits(Units units) +{ + switch (units) + { + case Units::Imperial: return "mph"; + case Units::Metric: return "km/h"; } - return res; } bool OSMDistanceToMeters(string const & osmRawValue, double & outMeters) @@ -275,4 +286,4 @@ string OSMDistanceToMetersString(string const & osmRawValue, return {}; } -} // namespace MeasurementUtils +} // namespace measurement_utils diff --git a/platform/measurement_utils.hpp b/platform/measurement_utils.hpp index 1da8145ec7..6a023bbb03 100644 --- a/platform/measurement_utils.hpp +++ b/platform/measurement_utils.hpp @@ -4,13 +4,27 @@ #include "std/string.hpp" -namespace MeasurementUtils +namespace measurement_utils { +enum class Units +{ + Metric = 0, + Imperial = 1 +}; + +inline string DebugPrint(Units units) +{ + switch (units) + { + case Units::Imperial: return "Units::Imperial"; + case Units::Metric: return "Units::Metric"; + } +} inline double MetersToMiles(double m) { return m * 0.000621371192; } inline double MilesToMeters(double mi) { return mi * 1609.344; } inline double MetersToFeet(double m) { return m * 3.2808399; } -inline double FeetToMeters(double ft) { return ft * 0.3048; } +inline double FeetToMeters(double ft) { return ft * 0.3048; } inline double FeetToMiles(double ft) { return ft * 5280; } inline double InchesToMeters(double in) { return in / 39.370; } inline double NauticalMilesToMeters(double nmi) { return nmi * 1852; } @@ -23,8 +37,11 @@ bool FormatDistance(double m, string & res); /// We always use meters and feet/yards for altitude string FormatAltitude(double altitudeInMeters); -/// km/h or mph -string FormatSpeed(double metersPerSecond); +// Return value is measured in km/h for Metric and in mph for Imperial. +string FormatSpeedWithDeviceUnits(double metersPerSecond); +string FormatSpeedWithUnits(double metersPerSecond, Units units); +string FormatSpeed(double metersPerSecond, Units units); +string FormatSpeedUnits(Units units); /// @param[in] dac Digits after comma in seconds. /// Use dac == 3 for our common conversions to DMS. @@ -47,5 +64,4 @@ bool OSMDistanceToMeters(string const & osmRawValue, double & outMeters); string OSMDistanceToMetersString(string const & osmRawValue, bool supportZeroAndNegativeValues = true, int digitsAfterComma = 2); - -} +} // namespace measurement_utils diff --git a/platform/platform_android.cpp b/platform/platform_android.cpp index f65c174037..758cfc1d7f 100644 --- a/platform/platform_android.cpp +++ b/platform/platform_android.cpp @@ -1,6 +1,7 @@ +#include "platform/constants.hpp" +#include "platform/measurement_utils.hpp" #include "platform/platform.hpp" #include "platform/platform_unix_impl.hpp" -#include "platform/constants.hpp" #include "platform/settings.hpp" #include "coding/zip_reader.hpp" @@ -251,12 +252,12 @@ Platform::EError Platform::MkDir(string const & dirName) const void Platform::SetupMeasurementSystem() const { - settings::Units u; - if (settings::Get(settings::kMeasurementUnits, u)) + auto units = measurement_utils::Units::Metric; + if (settings::Get(settings::kMeasurementUnits, units)) return; // @TODO Add correct implementation - u = settings::Metric; - settings::Set(settings::kMeasurementUnits, u); + units = measurement_utils::Units::Metric; + settings::Set(settings::kMeasurementUnits, units); } namespace diff --git a/platform/platform_ios.mm b/platform/platform_ios.mm index bbcabd8003..24505604b1 100644 --- a/platform/platform_ios.mm +++ b/platform/platform_ios.mm @@ -1,4 +1,5 @@ #include "platform/constants.hpp" +#include "platform/measurement_utils.hpp" #include "platform/platform.hpp" #include "platform/platform_unix_impl.hpp" #include "platform/settings.hpp" @@ -262,12 +263,12 @@ Platform::EConnectionType Platform::ConnectionStatus() void Platform::SetupMeasurementSystem() const { - settings::Units u; - if (settings::Get(settings::kMeasurementUnits, u)) + auto units = measurement_utils::Units::Metric; + if (settings::Get(settings::kMeasurementUnits, units)) return; BOOL const isMetric = [[[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue]; - u = isMetric ? settings::Metric : settings::Foot; - settings::Set(settings::kMeasurementUnits, u); + units = isMetric ? measurement_utils::Units::Metric : measurement_utils::Units::Imperial; + settings::Set(settings::kMeasurementUnits, units); } //////////////////////////////////////////////////////////////////////// diff --git a/platform/platform_qt.cpp b/platform/platform_qt.cpp index a79d8de8d9..dd78b7c4d4 100644 --- a/platform/platform_qt.cpp +++ b/platform/platform_qt.cpp @@ -1,5 +1,5 @@ - #include "platform/constants.hpp" +#include "platform/measurement_utils.hpp" #include "platform/platform.hpp" #include "platform/settings.hpp" @@ -74,12 +74,12 @@ Platform::EError Platform::MkDir(string const & dirName) const void Platform::SetupMeasurementSystem() const { - settings::Units u; - if (settings::Get(settings::kMeasurementUnits, u)) + auto units = measurement_utils::Units::Metric; + if (settings::Get(settings::kMeasurementUnits, units)) return; bool const isMetric = QLocale::system().measurementSystem() == QLocale::MetricSystem; - u = isMetric ? settings::Metric : settings::Foot; - settings::Set(settings::kMeasurementUnits, u); + units = isMetric ? measurement_utils::Units::Metric : measurement_utils::Units::Imperial; + settings::Set(settings::kMeasurementUnits, units); } #if defined(OMIM_OS_LINUX) diff --git a/platform/platform_tests/measurement_tests.cpp b/platform/platform_tests/measurement_tests.cpp index 158e016d21..8f5f793e87 100644 --- a/platform/platform_tests/measurement_tests.cpp +++ b/platform/platform_tests/measurement_tests.cpp @@ -3,7 +3,7 @@ #include "platform/measurement_utils.hpp" #include "platform/settings.hpp" -using namespace MeasurementUtils; +using namespace measurement_utils; using namespace settings; struct ScopedSettings @@ -30,7 +30,7 @@ struct ScopedSettings UNIT_TEST(Measurement_Smoke) { - ScopedSettings guard(settings::Metric); + ScopedSettings guard(Units::Metric); typedef pair PairT; @@ -89,17 +89,49 @@ UNIT_TEST(LatLonToDMS_NoRounding) UNIT_TEST(FormatAltitude) { ScopedSettings guard; - settings::Set(settings::kMeasurementUnits, settings::Foot); + settings::Set(settings::kMeasurementUnits, Units::Imperial); TEST_EQUAL(FormatAltitude(10000), "32808ft", ()); - settings::Set(settings::kMeasurementUnits, settings::Metric); + settings::Set(settings::kMeasurementUnits, Units::Metric); TEST_EQUAL(FormatAltitude(5), "5m", ()); } +UNIT_TEST(FormatSpeedWithDeviceUnits) +{ + { + ScopedSettings guard(Units::Metric); + TEST_EQUAL(FormatSpeedWithDeviceUnits(10), "36km/h", ()); + TEST_EQUAL(FormatSpeedWithDeviceUnits(1), "3.6km/h", ()); + } + + { + ScopedSettings guard(Units::Imperial); + TEST_EQUAL(FormatSpeedWithDeviceUnits(10), "22mph", ()); + TEST_EQUAL(FormatSpeedWithDeviceUnits(1), "2.2mph", ()); + } +} + +UNIT_TEST(FormatSpeedWithUnits) +{ + TEST_EQUAL(FormatSpeedWithUnits(10, Units::Metric), "36km/h", ()); + TEST_EQUAL(FormatSpeedWithUnits(1, Units::Metric), "3.6km/h", ()); + + TEST_EQUAL(FormatSpeedWithUnits(10, Units::Imperial), "22mph", ()); + TEST_EQUAL(FormatSpeedWithUnits(1, Units::Imperial), "2.2mph", ()); +} + UNIT_TEST(FormatSpeed) { - ScopedSettings guard(settings::Metric); - TEST_EQUAL(FormatSpeed(10), "36km/h", ()); - TEST_EQUAL(FormatSpeed(1), "3.6km/h", ()); + TEST_EQUAL(FormatSpeed(10, Units::Metric), "36", ()); + TEST_EQUAL(FormatSpeed(1, Units::Metric), "3.6", ()); + + TEST_EQUAL(FormatSpeed(10, Units::Imperial), "22", ()); + TEST_EQUAL(FormatSpeed(1, Units::Imperial), "2.2", ()); +} + +UNIT_TEST(FormatSpeedUnits) +{ + TEST_EQUAL(FormatSpeedUnits(Units::Metric), "km/h", ()); + TEST_EQUAL(FormatSpeedUnits(Units::Imperial), "mph", ()); } UNIT_TEST(OSMDistanceToMetersString) diff --git a/platform/settings.cpp b/platform/settings.cpp index 9feff99bc1..cbeccacf11 100644 --- a/platform/settings.cpp +++ b/platform/settings.cpp @@ -1,8 +1,8 @@ -#include "settings.hpp" -#include "platform.hpp" +#include "platform/settings.hpp" +#include "platform/location.hpp" +#include "platform/platform.hpp" #include "defines.hpp" -#include "location.hpp" #include "coding/reader_streambuf.hpp" #include "coding/file_writer.hpp" @@ -365,22 +365,23 @@ bool FromString(string const & s, DPairT & v) } template <> -string ToString(Units const & v) +string ToString(measurement_utils::Units const & v) { switch (v) { - case Foot: return "Foot"; - default: return "Metric"; + // The value "Foot" is left here for compatibility with old settings.ini files. + case measurement_utils::Units::Imperial: return "Foot"; + case measurement_utils::Units::Metric: return "Metric"; } } template <> -bool FromString(string const & s, Units & v) +bool FromString(string const & s, measurement_utils::Units & v) { if (s == "Metric") - v = Metric; + v = measurement_utils::Units::Metric; else if (s == "Foot") - v = Foot; + v = measurement_utils::Units::Imperial; else return false; diff --git a/platform/settings.hpp b/platform/settings.hpp index 290cc8b896..8edb1e9307 100644 --- a/platform/settings.hpp +++ b/platform/settings.hpp @@ -52,11 +52,6 @@ void Set(string const & key, ValueT const & value) inline void Delete(string const & key) { StringStorage::Instance().DeleteKeyAndValue(key); } inline void Clear() { StringStorage::Instance().Clear(); } -enum Units -{ - Metric = 0, - Foot -}; /// Use this function for running some stuff once according to date. /// @param[in] date Current date in format yymmdd. -- cgit v1.2.3