From f1427a834ddc833bc63340b697e096ba3aa1c36f Mon Sep 17 00:00:00 2001 From: karenzshea Date: Mon, 30 Jan 2017 12:30:31 +0100 Subject: [PATCH] fix bitwise operators, selectively add annotations to response obj --- include/engine/api/route_api.hpp | 93 ++++++++++++------- include/engine/api/route_parameters.hpp | 12 ++- .../server/api/route_parameters_grammar.hpp | 8 +- 3 files changed, 77 insertions(+), 36 deletions(-) diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index a984f1090..8832a8a9b 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -215,43 +215,72 @@ class RouteAPI : public BaseAPI std::vector annotations; - if (parameters.annotations) + if (!static_cast(parameters.annotations_type & + RouteParameters::AnnotationsType::None)) { for (const auto idx : util::irange(0UL, leg_geometries.size())) { - util::json::Array durations; - util::json::Array distances; - util::json::Array weights; - util::json::Array nodes; - util::json::Array datasources; auto &leg_geometry = leg_geometries[idx]; - - durations.values.reserve(leg_geometry.annotations.size()); - distances.values.reserve(leg_geometry.annotations.size()); - weights.values.reserve(leg_geometry.annotations.size()); - nodes.values.reserve(leg_geometry.osm_node_ids.size()); - datasources.values.reserve(leg_geometry.annotations.size()); - - std::for_each(leg_geometry.annotations.begin(), - leg_geometry.annotations.end(), - [this, &durations, &distances, &weights, &datasources]( - const guidance::LegGeometry::Annotation &step) { - durations.values.push_back(step.duration); - distances.values.push_back(step.distance); - weights.values.push_back(step.weight); - datasources.values.push_back(step.datasource); - }); - std::for_each(leg_geometry.osm_node_ids.begin(), - leg_geometry.osm_node_ids.end(), - [this, &nodes](const OSMNodeID &node_id) { - nodes.values.push_back(static_cast(node_id)); - }); util::json::Object annotation; - annotation.values["distance"] = std::move(distances); - annotation.values["duration"] = std::move(durations); - annotation.values["weight"] = std::move(weights); - annotation.values["nodes"] = std::move(nodes); - annotation.values["datasources"] = std::move(datasources); + if (parameters.annotations_type & RouteParameters::AnnotationsType::Duration) + { + util::json::Array durations; + durations.values.reserve(leg_geometry.annotations.size()); + std::for_each( + leg_geometry.annotations.begin(), + leg_geometry.annotations.end(), + [this, &durations](const guidance::LegGeometry::Annotation &step) { + durations.values.push_back(step.duration); + }); + annotation.values["duration"] = std::move(durations); + } + if (parameters.annotations_type & RouteParameters::AnnotationsType::Distance) + { + util::json::Array distances; + distances.values.reserve(leg_geometry.annotations.size()); + std::for_each( + leg_geometry.annotations.begin(), + leg_geometry.annotations.end(), + [this, &distances](const guidance::LegGeometry::Annotation &step) { + distances.values.push_back(step.distance); + }); + annotation.values["distance"] = std::move(distances); + } + if (parameters.annotations_type & RouteParameters::AnnotationsType::Weight) + { + util::json::Array weights; + weights.values.reserve(leg_geometry.annotations.size()); + std::for_each(leg_geometry.annotations.begin(), + leg_geometry.annotations.end(), + [this, &weights](const guidance::LegGeometry::Annotation &step) { + weights.values.push_back(step.weight); + }); + annotation.values["weight"] = std::move(weights); + } + if (parameters.annotations_type & RouteParameters::AnnotationsType::Datasources) + { + util::json::Array datasources; + datasources.values.reserve(leg_geometry.annotations.size()); + std::for_each( + leg_geometry.annotations.begin(), + leg_geometry.annotations.end(), + [this, &datasources](const guidance::LegGeometry::Annotation &step) { + datasources.values.push_back(step.datasource); + }); + annotation.values["datasources"] = std::move(datasources); + } + if (parameters.annotations_type & RouteParameters::AnnotationsType::Nodes) + { + util::json::Array nodes; + nodes.values.reserve(leg_geometry.osm_node_ids.size()); + std::for_each(leg_geometry.osm_node_ids.begin(), + leg_geometry.osm_node_ids.end(), + [this, &nodes](const OSMNodeID &node_id) { + nodes.values.push_back(static_cast(node_id)); + }); + annotation.values["nodes"] = std::move(nodes); + } + annotations.push_back(std::move(annotation)); } } diff --git a/include/engine/api/route_parameters.hpp b/include/engine/api/route_parameters.hpp index 3ad4cbfee..5343abc65 100644 --- a/include/engine/api/route_parameters.hpp +++ b/include/engine/api/route_parameters.hpp @@ -73,7 +73,9 @@ struct RouteParameters : public BaseParameters Duration = 1 << 1, Nodes = 1 << 2, Distance = 1 << 3, - All = Duration | Nodes | Distance + Weight = 1 << 4, + Datasources = 1 << 5, + All = Duration | Nodes | Distance | Weight | Datasources }; RouteParameters() = default; @@ -134,6 +136,14 @@ struct RouteParameters : public BaseParameters bool IsValid() const { return coordinates.size() >= 2 && BaseParameters::IsValid(); } }; +inline bool operator&(RouteParameters::AnnotationsType lhs, + RouteParameters::AnnotationsType rhs) +{ + return static_cast( + static_cast>(lhs) & + static_cast>(rhs)); +} + inline RouteParameters::AnnotationsType operator|(RouteParameters::AnnotationsType lhs, RouteParameters::AnnotationsType rhs) { diff --git a/include/server/api/route_parameters_grammar.hpp b/include/server/api/route_parameters_grammar.hpp index 9756155ea..9178eaafd 100644 --- a/include/server/api/route_parameters_grammar.hpp +++ b/include/server/api/route_parameters_grammar.hpp @@ -55,11 +55,13 @@ struct RouteParametersGrammar : public BaseParametersGrammar