diff --git a/include/MantleAPI/Traffic/i_controller_config.h b/include/MantleAPI/Traffic/i_controller_config.h index 414317d5b62f63f16c7756a3c68744074008beb1..1f9ab47c0066cf0f2cd898a178fc99464467c7b3 100644 --- a/include/MantleAPI/Traffic/i_controller_config.h +++ b/include/MantleAPI/Traffic/i_controller_config.h @@ -30,16 +30,6 @@ namespace mantle_api { struct IControllerConfig { - IControllerConfig() = default; - IControllerConfig(const IControllerConfig& controller_config) - : map_query_service(controller_config.map_query_service) - { - std::transform(controller_config.control_strategies.begin(), - controller_config.control_strategies.end(), - std::back_inserter(control_strategies), - [](auto& control_strategy) { return std::make_unique<mantle_api::ControlStrategy>(*control_strategy); }); - } - virtual ~IControllerConfig() = default; std::string name; @@ -52,23 +42,57 @@ struct IControllerConfig inline bool operator==(const IControllerConfig& lhs, const IControllerConfig& rhs) noexcept { - bool control_strategies_equal = true; - if (lhs.control_strategies.size() != rhs.control_strategies.size()) + if (&lhs == &rhs) { - control_strategies_equal = false; + return true; } - else + + const auto compare_control_strategies = [](const auto& lhs, const auto& rhs) { - for (unsigned int i = 0; i < lhs.control_strategies.size(); i++) + if (lhs.size() != rhs.size()) { - if (*(lhs.control_strategies[i]) != *(rhs.control_strategies[i])) + return false; + } + else + { + for (size_t i = 0; i < lhs.size(); i++) { - control_strategies_equal = false; - break; + if (*(lhs[i]) != *(rhs[i])) + { + return false; + } } } - } - return control_strategies_equal; + return true; + }; + + const auto compare_route_definition = [](const auto& lhs, const auto& rhs) + { + if (lhs.waypoints.size() != rhs.waypoints.size()) + { + return false; + } + + for (size_t i = 0; i < lhs.waypoints.size(); ++i) + { + if (lhs.waypoints[i].route_strategy != rhs.waypoints[i].route_strategy || + lhs.waypoints[i].waypoint != rhs.waypoints[i].waypoint) + { + return false; + } + } + return true; + }; + + return lhs.name == rhs.name && + lhs.map_query_service == rhs.map_query_service && + compare_control_strategies(lhs.control_strategies, rhs.control_strategies) && + compare_route_definition(lhs.route_definition, rhs.route_definition); +} + +inline bool operator!=(const IControllerConfig& lhs, const IControllerConfig& rhs) noexcept +{ + return !(lhs == rhs); } struct NoOpControllerConfig : public IControllerConfig @@ -84,6 +108,21 @@ struct ExternalControllerConfig : public IControllerConfig std::map<std::string, std::string> parameters; }; +inline bool operator==(const ExternalControllerConfig& lhs, const ExternalControllerConfig& rhs) noexcept +{ + auto compare_base = [](const IControllerConfig& lhs, const IControllerConfig& rhs) + { + return lhs == rhs; + }; + + return compare_base(lhs, rhs) && lhs.parameters == rhs.parameters; +} + +inline bool operator!=(const ExternalControllerConfig& lhs, const ExternalControllerConfig& rhs) noexcept +{ + return !(lhs == rhs); +} + } // namespace mantle_api #endif // MANTLEAPI_TRAFFIC_I_CONTROLLER_CONFIG_H