fix bitwise operators, selectively add annotations to response obj
This commit is contained in:
parent
04954de9c6
commit
f1427a834d
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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) |
|
||||||
|
Loading…
Reference in New Issue
Block a user