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:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-06-08 17:56:28 +0300
committerVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-06-17 19:36:52 +0300
commitb0a831d8ebb0c88b3bfaee345ce31a255d30ef30 (patch)
tree74d7fa0f86492bdece6f98c726036c0b45de7f4b /routing
parenta35256f8e791dda8e5e343de8483efc75d83ef58 (diff)
Code refactoring. Implementing some functionality to VehicleModel class and removing it form derived classes.
Diffstat (limited to 'routing')
-rw-r--r--routing/bicycle_model.cpp45
-rw-r--r--routing/bicycle_model.hpp10
-rw-r--r--routing/pedestrian_model.cpp35
-rw-r--r--routing/pedestrian_model.hpp6
-rw-r--r--routing/vehicle_model.cpp23
-rw-r--r--routing/vehicle_model.hpp21
6 files changed, 57 insertions, 83 deletions
diff --git a/routing/bicycle_model.cpp b/routing/bicycle_model.cpp
index 5b7f830ee6..458bdced2b 100644
--- a/routing/bicycle_model.cpp
+++ b/routing/bicycle_model.cpp
@@ -601,68 +601,43 @@ BicycleModel::BicycleModel(VehicleModel::InitListT const & speedLimits)
void BicycleModel::Init()
{
- initializer_list<char const *> hwtagYesbicycle = {"hwtag", "yesbicycle"};
+ initializer_list<char const *> hwtagYesBicycle = {"hwtag", "yesbicycle"};
- m_yesBicycleType = classif().GetTypeByPath(hwtagYesbicycle);
+ m_yesBicycleType = classif().GetTypeByPath(hwtagYesBicycle);
m_noBicycleType = classif().GetTypeByPath({"hwtag", "nobicycle"});
m_bidirBicycleType = classif().GetTypeByPath({"hwtag", "bidir_bicycle"});
initializer_list<char const *> arr[] = {
- hwtagYesbicycle, {"route", "ferry"}, {"man_made", "pier"},
+ hwtagYesBicycle, {"route", "ferry"}, {"man_made", "pier"},
};
SetAdditionalRoadTypes(classif(), arr, ARRAY_SIZE(arr));
}
-VehicleModel::Restriction BicycleModel::IsBicycleAllowed(feature::TypesHolder const & types) const
+IVehicleModel::RoadAvailability BicycleModel::GetRoadAvailability(feature::TypesHolder const & types) const
{
if (types.Has(m_yesBicycleType))
- return Restriction::Yes;
+ return RoadAvailability::Available;
if (types.Has(m_noBicycleType))
- return Restriction::No;
- return Restriction::Unknown;
+ return RoadAvailability::NotAvailable;
+ return RoadAvailability::Unknown;
}
-VehicleModel::Restriction BicycleModel::IsBicycleBidir(feature::TypesHolder const & types) const
+bool BicycleModel::IsBicycleBidir(feature::TypesHolder const & types) const
{
- return types.Has(m_bidirBicycleType) ? Restriction::Yes : Restriction::Unknown;
-}
-
-double BicycleModel::GetSpeed(FeatureType const & f) const
-{
- feature::TypesHolder const types(f);
-
- Restriction const restriction = IsBicycleAllowed(types);
- if (restriction == Restriction::Yes)
- return VehicleModel::GetMaxSpeed();
- if (restriction != Restriction::No && HasRoadType(types))
- return VehicleModel::GetMinTypeSpeed(types);
-
- return 0.0;
+ return types.Has(m_bidirBicycleType);
}
bool BicycleModel::IsOneWay(FeatureType const & f) const
{
feature::TypesHolder const types(f);
- if (IsBicycleBidir(types) == Restriction::Yes)
+ if (IsBicycleBidir(types))
return false;
return VehicleModel::IsOneWay(f);
}
-bool BicycleModel::IsRoad(FeatureType const & f) const
-{
- if (f.GetFeatureType() != feature::GEOM_LINE)
- return false;
-
- feature::TypesHolder const types(f);
-
- if (IsBicycleAllowed(types) == Restriction::No)
- return false;
- return VehicleModel::HasRoadType(types);
-}
-
BicycleModelFactory::BicycleModelFactory()
{
m_models[string()] = make_shared<BicycleModel>(g_bicycleLimitsDefault);
diff --git a/routing/bicycle_model.hpp b/routing/bicycle_model.hpp
index 38961f3d6f..1008fe07bd 100644
--- a/routing/bicycle_model.hpp
+++ b/routing/bicycle_model.hpp
@@ -15,16 +15,16 @@ public:
BicycleModel(VehicleModel::InitListT const & speedLimits);
/// VehicleModel overrides:
- double GetSpeed(FeatureType const & f) const override;
bool IsOneWay(FeatureType const & f) const override;
- bool IsRoad(FeatureType const & f) const override;
+
+protected:
+ RoadAvailability GetRoadAvailability(feature::TypesHolder const & types) const override;
private:
void Init();
- Restriction IsBicycleAllowed(feature::TypesHolder const & types) const;
- /// @return Restriction::Yes if it is allowed to ride bicycle in two directions.
- Restriction IsBicycleBidir(feature::TypesHolder const & types) const;
+ /// @return true if it is allowed to ride bicycle in two directions.
+ bool IsBicycleBidir(feature::TypesHolder const & types) const;
uint32_t m_noBicycleType = 0;
uint32_t m_yesBicycleType = 0;
diff --git a/routing/pedestrian_model.cpp b/routing/pedestrian_model.cpp
index 9e30abd9ee..510568432f 100644
--- a/routing/pedestrian_model.cpp
+++ b/routing/pedestrian_model.cpp
@@ -633,39 +633,13 @@ void PedestrianModel::Init()
SetAdditionalRoadTypes(classif(), arr, ARRAY_SIZE(arr));
}
-VehicleModel::Restriction PedestrianModel::IsPedestrianAllowed(feature::TypesHolder const & types) const
+IVehicleModel::RoadAvailability PedestrianModel::GetRoadAvailability(feature::TypesHolder const & types) const
{
if (types.Has(m_yesFootType))
- return Restriction::Yes;
+ return RoadAvailability::Available;
if (types.Has(m_noFootType))
- return Restriction::No;
- return Restriction::Unknown;
-}
-
-double PedestrianModel::GetSpeed(FeatureType const & f) const
-{
- feature::TypesHolder const types(f);
-
- Restriction const restriction = IsPedestrianAllowed(types);
- if (restriction == Restriction::Yes)
- return VehicleModel::GetMaxSpeed();
- if (restriction != Restriction::No && HasRoadType(types))
- return VehicleModel::GetMinTypeSpeed(types);
-
- return 0.0;
-}
-
-bool PedestrianModel::IsRoad(FeatureType const & f) const
-{
- if (f.GetFeatureType() != feature::GEOM_LINE)
- return false;
-
- feature::TypesHolder const types(f);
-
- if (IsPedestrianAllowed(types) == Restriction::No)
- return false;
-
- return VehicleModel::HasRoadType(types);
+ return RoadAvailability::NotAvailable;
+ return RoadAvailability::Unknown;
}
PedestrianModelFactory::PedestrianModelFactory()
@@ -712,5 +686,4 @@ shared_ptr<IVehicleModel> PedestrianModelFactory::GetVehicleModelForCountry(stri
LOG(LDEBUG, ("Pedestrian model wasn't found, default model is used instead:", country));
return PedestrianModelFactory::GetVehicleModel();
}
-
} // routing
diff --git a/routing/pedestrian_model.hpp b/routing/pedestrian_model.hpp
index 6cc5af66f5..c00df62db8 100644
--- a/routing/pedestrian_model.hpp
+++ b/routing/pedestrian_model.hpp
@@ -15,13 +15,13 @@ public:
PedestrianModel(VehicleModel::InitListT const & speedLimits);
/// VehicleModel overrides:
- double GetSpeed(FeatureType const & f) const override;
bool IsOneWay(FeatureType const &) const override { return false; }
- bool IsRoad(FeatureType const & f) const override;
+
+protected:
+ RoadAvailability GetRoadAvailability(feature::TypesHolder const & types) const override;
private:
void Init();
- Restriction IsPedestrianAllowed(feature::TypesHolder const & types) const;
uint32_t m_noFootType = 0;
uint32_t m_yesFootType = 0;
diff --git a/routing/vehicle_model.cpp b/routing/vehicle_model.cpp
index d08faaef9b..79a94d835e 100644
--- a/routing/vehicle_model.cpp
+++ b/routing/vehicle_model.cpp
@@ -32,7 +32,15 @@ void VehicleModel::SetAdditionalRoadTypes(Classificator const & c,
double VehicleModel::GetSpeed(FeatureType const & f) const
{
- return GetMinTypeSpeed(feature::TypesHolder(f));
+ feature::TypesHolder const types(f);
+
+ RoadAvailability const restriction = GetRoadAvailability(types);
+ if (restriction == RoadAvailability::Available)
+ return VehicleModel::GetMaxSpeed();
+ if (restriction != RoadAvailability::NotAvailable && HasRoadType(types))
+ return VehicleModel::GetMinTypeSpeed(types);
+
+ return 0.0;
}
double VehicleModel::GetMinTypeSpeed(feature::TypesHolder const & types) const
@@ -63,7 +71,14 @@ bool VehicleModel::HasOneWayType(feature::TypesHolder const & types) const
bool VehicleModel::IsRoad(FeatureType const & f) const
{
- return (f.GetFeatureType() == feature::GEOM_LINE) && HasRoadType(feature::TypesHolder(f));
+ if (f.GetFeatureType() != feature::GEOM_LINE)
+ return false;
+
+ feature::TypesHolder const types(f);
+
+ if (GetRoadAvailability(types) == RoadAvailability::NotAvailable)
+ return false;
+ return VehicleModel::HasRoadType(types);
}
bool VehicleModel::IsRoadType(uint32_t type) const
@@ -72,4 +87,8 @@ bool VehicleModel::IsRoadType(uint32_t type) const
m_types.find(ftypes::BaseChecker::PrepareToMatch(type, 2)) != m_types.end();
}
+IVehicleModel::RoadAvailability VehicleModel::GetRoadAvailability(feature::TypesHolder const & /* types */) const
+{
+ return RoadAvailability::Unknown;
+}
} // namespace routing
diff --git a/routing/vehicle_model.hpp b/routing/vehicle_model.hpp
index c57af6e396..a052c6e65f 100644
--- a/routing/vehicle_model.hpp
+++ b/routing/vehicle_model.hpp
@@ -19,6 +19,13 @@ namespace routing
class IVehicleModel
{
public:
+ enum class RoadAvailability
+ {
+ NotAvailable,
+ Available,
+ Unknown,
+ };
+
virtual ~IVehicleModel() {}
/// @return Allowed speed in KMpH.
@@ -56,6 +63,7 @@ public:
char const * m_types[2]; /// 2-arity road type
double m_speedKMpH; /// max allowed speed on this road type
};
+
typedef initializer_list<SpeedForType> InitListT;
VehicleModel(Classificator const & c, InitListT const & speedLimits);
@@ -66,6 +74,12 @@ public:
bool IsOneWay(FeatureType const & f) const override;
bool IsRoad(FeatureType const & f) const override;
+protected:
+ /// @returns a special restriction which is set to the feature.
+ virtual RoadAvailability GetRoadAvailability(feature::TypesHolder const & types) const;
+
+public:
+
/// @returns true if |m_types| or |m_addRoadTypes| contains |type| and false otherwise.
bool IsRoadType(uint32_t type) const;
template <class TList>
@@ -80,13 +94,6 @@ public:
}
protected:
- enum class Restriction
- {
- No,
- Yes,
- Unknown,
- };
-
/// Used in derived class constructors only. Not for public use.
void SetAdditionalRoadTypes(Classificator const & c,
initializer_list<char const *> const * arr, size_t sz);