fix bitwise operators, selectively add annotations to response obj

This commit is contained in:
karenzshea 2017-01-30 12:30:31 +01:00 committed by Patrick Niklaus
parent 04954de9c6
commit f1427a834d
3 changed files with 77 additions and 36 deletions

View File

@ -215,43 +215,72 @@ class RouteAPI : public BaseAPI
std::vector<util::json::Object> annotations; std::vector<util::json::Object> annotations;
if (parameters.annotations) if (!static_cast<bool>(parameters.annotations_type &
RouteParameters::AnnotationsType::None))
{ {
for (const auto idx : util::irange<std::size_t>(0UL, leg_geometries.size())) for (const auto idx : util::irange<std::size_t>(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]; 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<std::uint64_t>(node_id));
});
util::json::Object annotation; util::json::Object annotation;
annotation.values["distance"] = std::move(distances); if (parameters.annotations_type & RouteParameters::AnnotationsType::Duration)
annotation.values["duration"] = std::move(durations); {
annotation.values["weight"] = std::move(weights); util::json::Array durations;
annotation.values["nodes"] = std::move(nodes); durations.values.reserve(leg_geometry.annotations.size());
annotation.values["datasources"] = std::move(datasources); 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<std::uint64_t>(node_id));
});
annotation.values["nodes"] = std::move(nodes);
}
annotations.push_back(std::move(annotation)); annotations.push_back(std::move(annotation));
} }
} }

View File

@ -73,7 +73,9 @@ struct RouteParameters : public BaseParameters
Duration = 1 << 1, Duration = 1 << 1,
Nodes = 1 << 2, Nodes = 1 << 2,
Distance = 1 << 3, Distance = 1 << 3,
All = Duration | Nodes | Distance Weight = 1 << 4,
Datasources = 1 << 5,
All = Duration | Nodes | Distance | Weight | Datasources
}; };
RouteParameters() = default; RouteParameters() = default;
@ -134,6 +136,14 @@ struct RouteParameters : public BaseParameters
bool IsValid() const { return coordinates.size() >= 2 && BaseParameters::IsValid(); } bool IsValid() const { return coordinates.size() >= 2 && BaseParameters::IsValid(); }
}; };
inline bool operator&(RouteParameters::AnnotationsType lhs,
RouteParameters::AnnotationsType rhs)
{
return static_cast<bool>(
static_cast<std::underlying_type_t<RouteParameters::AnnotationsType>>(lhs) &
static_cast<std::underlying_type_t<RouteParameters::AnnotationsType>>(rhs));
}
inline RouteParameters::AnnotationsType operator|(RouteParameters::AnnotationsType lhs, inline RouteParameters::AnnotationsType operator|(RouteParameters::AnnotationsType lhs,
RouteParameters::AnnotationsType rhs) RouteParameters::AnnotationsType rhs)
{ {

View File

@ -55,11 +55,13 @@ struct RouteParametersGrammar : public BaseParametersGrammar<Iterator, Signature
"full", engine::api::RouteParameters::OverviewType::Full)( "full", engine::api::RouteParameters::OverviewType::Full)(
"false", engine::api::RouteParameters::OverviewType::False); "false", engine::api::RouteParameters::OverviewType::False);
annotations_type.add("all", engine::api::RouteParameters::AnnotationsType::All)( annotations_type.add("true", engine::api::RouteParameters::AnnotationsType::All)(
"none", engine::api::RouteParameters::AnnotationsType::None)( "false", engine::api::RouteParameters::AnnotationsType::None)(
"duration", engine::api::RouteParameters::AnnotationsType::Duration)( "duration", engine::api::RouteParameters::AnnotationsType::Duration)(
"nodes", engine::api::RouteParameters::AnnotationsType::Nodes)( "nodes", engine::api::RouteParameters::AnnotationsType::Nodes)(
"distance", engine::api::RouteParameters::AnnotationsType::Distance); "distance", engine::api::RouteParameters::AnnotationsType::Distance)(
"weight", engine::api::RouteParameters::AnnotationsType::Weight)(
"datasources", engine::api::RouteParameters::AnnotationsType::Datasources);
base_rule = base_rule =
BaseGrammar::base_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1) |