diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-06-08 17:56:28 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-06-17 19:36:52 +0300 |
commit | b0a831d8ebb0c88b3bfaee345ce31a255d30ef30 (patch) | |
tree | 74d7fa0f86492bdece6f98c726036c0b45de7f4b /routing | |
parent | a35256f8e791dda8e5e343de8483efc75d83ef58 (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.cpp | 45 | ||||
-rw-r--r-- | routing/bicycle_model.hpp | 10 | ||||
-rw-r--r-- | routing/pedestrian_model.cpp | 35 | ||||
-rw-r--r-- | routing/pedestrian_model.hpp | 6 | ||||
-rw-r--r-- | routing/vehicle_model.cpp | 23 | ||||
-rw-r--r-- | routing/vehicle_model.hpp | 21 |
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); |