Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Grechuhin <i.grechuhin@gmail.com>2016-07-06 13:49:16 +0300
committerIlya Grechuhin <i.grechuhin@gmail.com>2016-07-07 14:23:14 +0300
commitf7aafa00e27d85f4d0f2b4c504d9063d392b41f8 (patch)
tree42a642688dfef0e8dea4d9fc8ebacd185dc75993 /platform
parentaae90b0081d9b38fe2d0d58ee63445a8e58f6462 (diff)
[omim] Refactored measurement_utils.
Diffstat (limited to 'platform')
-rw-r--r--platform/measurement_utils.cpp67
-rw-r--r--platform/measurement_utils.hpp28
-rw-r--r--platform/platform_android.cpp11
-rw-r--r--platform/platform_ios.mm9
-rw-r--r--platform/platform_qt.cpp10
-rw-r--r--platform/platform_tests/measurement_tests.cpp46
-rw-r--r--platform/settings.cpp19
-rw-r--r--platform/settings.hpp5
8 files changed, 126 insertions, 69 deletions
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<double, char const *> 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<DPairT>(string const & s, DPairT & v)
}
template <>
-string ToString<Units>(Units const & v)
+string ToString<measurement_utils::Units>(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<Units>(string const & s, Units & v)
+bool FromString<measurement_utils::Units>(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.