Fixes ownership semantics and forwarding references misplacements in the JSON factory

This commit is contained in:
Daniel J. Hofmann 2016-03-01 14:47:47 +01:00 committed by Patrick Niklaus
parent 6380a6be05
commit 70fb12b10e
2 changed files with 24 additions and 34 deletions

View File

@ -4,6 +4,11 @@
#include "extractor/turn_instructions.hpp" #include "extractor/turn_instructions.hpp"
#include "extractor/travel_mode.hpp" #include "extractor/travel_mode.hpp"
#include "engine/polyline_compressor.hpp" #include "engine/polyline_compressor.hpp"
#include "engine/guidance/route_step.hpp"
#include "engine/guidance/step_maneuver.hpp"
#include "engine/guidance/route_leg.hpp"
#include "engine/guidance/route.hpp"
#include "engine/guidance/leg_geometry.hpp"
#include "util/coordinate.hpp" #include "util/coordinate.hpp"
#include "util/json_container.hpp" #include "util/json_container.hpp"
@ -20,15 +25,6 @@ namespace engine
struct Hint; struct Hint;
namespace guidance
{
class RouteLeg;
class RouteStep;
class StepManeuver;
class Route;
class LegGeometry;
}
namespace api namespace api
{ {
namespace json namespace json
@ -62,19 +58,19 @@ util::json::Object makeGeoJSONLineString(ForwardIter begin, ForwardIter end)
util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver); util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver);
util::json::Object makeRouteStep(guidance::RouteStep &&step, util::json::Object makeRouteStep(guidance::RouteStep step,
boost::optional<util::json::Value> geometry); boost::optional<util::json::Value> geometry);
util::json::Object makeRoute(const guidance::Route &route, util::json::Object makeRoute(const guidance::Route &route,
util::json::Array &&legs, util::json::Array legs,
boost::optional<util::json::Value> geometry); boost::optional<util::json::Value> geometry);
util::json::Object util::json::Object
makeWaypoint(const util::Coordinate location, std::string &&name, const Hint &hint); makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint);
util::json::Object makeRouteLeg(guidance::RouteLeg &&leg, util::json::Array &&steps); util::json::Object makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps);
util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> &&legs, util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> legs,
std::vector<util::json::Value> step_geometries); std::vector<util::json::Value> step_geometries);
} }
} }

View File

@ -1,10 +1,5 @@
#include "engine/api/json_factory.hpp" #include "engine/api/json_factory.hpp"
#include "engine/guidance/route_step.hpp"
#include "engine/guidance/step_maneuver.hpp"
#include "engine/guidance/route_leg.hpp"
#include "engine/guidance/route.hpp"
#include "engine/guidance/leg_geometry.hpp"
#include "engine/polyline_compressor.hpp" #include "engine/polyline_compressor.hpp"
#include "engine/hint.hpp" #include "engine/hint.hpp"
@ -171,20 +166,20 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver)
return step_maneuver; return step_maneuver;
} }
util::json::Object makeRouteStep(guidance::RouteStep &&step, util::json::Value geometry) util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geometry)
{ {
util::json::Object route_step; util::json::Object route_step;
route_step.values["distance"] = step.distance; route_step.values["distance"] = std::move(step.distance);
route_step.values["duration"] = step.duration; route_step.values["duration"] = std::move(step.duration);
route_step.values["name"] = std::move(step.name); route_step.values["name"] = std::move(step.name);
route_step.values["mode"] = detail::modeToString(step.mode); route_step.values["mode"] = detail::modeToString(std::move(step.mode));
route_step.values["maneuver"] = makeStepManeuver(step.maneuver); route_step.values["maneuver"] = makeStepManeuver(std::move(step.maneuver));
route_step.values["geometry"] = std::move(geometry); route_step.values["geometry"] = std::move(geometry);
return route_step; return route_step;
} }
util::json::Object makeRoute(const guidance::Route &route, util::json::Object makeRoute(const guidance::Route &route,
util::json::Array &&legs, util::json::Array legs,
boost::optional<util::json::Value> geometry) boost::optional<util::json::Value> geometry)
{ {
util::json::Object json_route; util::json::Object json_route;
@ -193,13 +188,12 @@ util::json::Object makeRoute(const guidance::Route &route,
json_route.values["legs"] = std::move(legs); json_route.values["legs"] = std::move(legs);
if (geometry) if (geometry)
{ {
json_route.values["geometry"] = std::move(*geometry); json_route.values["geometry"] = *std::move(geometry);
} }
return json_route; return json_route;
} }
util::json::Object util::json::Object makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint)
makeWaypoint(const util::Coordinate location, std::string &&name, const Hint &hint)
{ {
util::json::Object waypoint; util::json::Object waypoint;
waypoint.values["location"] = detail::coordinateToLonLat(location); waypoint.values["location"] = detail::coordinateToLonLat(location);
@ -208,29 +202,29 @@ makeWaypoint(const util::Coordinate location, std::string &&name, const Hint &hi
return waypoint; return waypoint;
} }
util::json::Object makeRouteLeg(guidance::RouteLeg &&leg, util::json::Array &&steps) util::json::Object makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps)
{ {
util::json::Object route_leg; util::json::Object route_leg;
route_leg.values["distance"] = leg.distance; route_leg.values["distance"] = std::move(leg.distance);
route_leg.values["duration"] = leg.duration; route_leg.values["duration"] = std::move(leg.duration);
route_leg.values["summary"] = std::move(leg.summary); route_leg.values["summary"] = std::move(leg.summary);
route_leg.values["steps"] = std::move(steps); route_leg.values["steps"] = std::move(steps);
return route_leg; return route_leg;
} }
util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> &&legs, util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> legs,
std::vector<util::json::Value> step_geometries) std::vector<util::json::Value> step_geometries)
{ {
util::json::Array json_legs; util::json::Array json_legs;
auto step_geometry_iter = step_geometries.begin(); auto step_geometry_iter = step_geometries.begin();
for (const auto idx : boost::irange(0UL, legs.size())) for (const auto idx : boost::irange(0UL, legs.size()))
{ {
auto &&leg = std::move(legs[idx]); auto leg = std::move(legs[idx]);
util::json::Array json_steps; util::json::Array json_steps;
json_steps.values.reserve(leg.steps.size()); json_steps.values.reserve(leg.steps.size());
std::transform( std::transform(
std::make_move_iterator(leg.steps.begin()), std::make_move_iterator(leg.steps.end()), std::make_move_iterator(leg.steps.begin()), std::make_move_iterator(leg.steps.end()),
std::back_inserter(json_steps.values), [&step_geometry_iter](guidance::RouteStep &&step) std::back_inserter(json_steps.values), [&step_geometry_iter](guidance::RouteStep step)
{ {
return makeRouteStep(std::move(step), std::move(*step_geometry_iter++)); return makeRouteStep(std::move(step), std::move(*step_geometry_iter++));
}); });