From acd3e81ab4f2c61b328a1b8d088f610dc99b48dd Mon Sep 17 00:00:00 2001 From: Denis Chaplygin Date: Tue, 6 Aug 2019 12:51:38 +0300 Subject: [PATCH] Removed ineffectivness in the serialization schema. Positions are structs now and distance/duration matrices are just arrays. --- include/engine/api/base_api.hpp | 5 +- .../api/flatbuffers/fbresult_generated.h | 390 ++++++------------ include/engine/api/flatbuffers/position.fbs | 2 +- include/engine/api/flatbuffers/table.fbs | 13 +- include/engine/api/table_api.hpp | 87 ++-- 5 files changed, 156 insertions(+), 341 deletions(-) diff --git a/include/engine/api/base_api.hpp b/include/engine/api/base_api.hpp index 5bda72910..b7da12f6e 100644 --- a/include/engine/api/base_api.hpp +++ b/include/engine/api/base_api.hpp @@ -76,9 +76,10 @@ class BaseAPI // protected: flatbuffers::Offset MakeWaypoint(flatbuffers::FlatBufferBuilder& builder, const PhantomNode &phantom) const { - auto location = fbresult::CreatePosition(builder, static_cast(util::toFloating(phantom.location.lon)), static_cast(util::toFloating(phantom.location.lat))); + + auto location = fbresult::Position(static_cast(util::toFloating(phantom.location.lon)), static_cast(util::toFloating(phantom.location.lat))); fbresult::WaypointBuilder waypoint(builder); - waypoint.add_location(location); + waypoint.add_location(&location); waypoint.add_distance(util::coordinate_calculation::fccApproximateDistance(phantom.location, phantom.input_location)); waypoint.add_name(builder.CreateString(facade.GetNameForID(facade.GetNameIndex(phantom.forward_segment_id.id)).to_string())); diff --git a/include/engine/api/flatbuffers/fbresult_generated.h b/include/engine/api/flatbuffers/fbresult_generated.h index 59287183f..15e6318ce 100644 --- a/include/engine/api/flatbuffers/fbresult_generated.h +++ b/include/engine/api/flatbuffers/fbresult_generated.h @@ -12,7 +12,6 @@ namespace api { namespace fbresult { struct Position; -struct PositionT; struct Waypoint; struct WaypointT; @@ -53,9 +52,6 @@ struct MatchT; struct Nearest; struct NearestT; -struct VectorDouble; -struct VectorDoubleT; - struct Table; struct TableT; @@ -416,78 +412,34 @@ struct ServiceResponseUnion { bool VerifyServiceResponse(flatbuffers::Verifier &verifier, const void *obj, ServiceResponse type); bool VerifyServiceResponseVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); -struct PositionT : public flatbuffers::NativeTable { - typedef Position TableType; - double longitute; - double latitude; - PositionT() - : longitute(0.0), - latitude(0.0) { - } -}; +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Position FLATBUFFERS_FINAL_CLASS { + private: + double longitute_; + double latitude_; -struct Position FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef PositionT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_LONGITUTE = 4, - VT_LATITUDE = 6 - }; + public: + Position() { + memset(static_cast(this), 0, sizeof(Position)); + } + Position(double _longitute, double _latitude) + : longitute_(flatbuffers::EndianScalar(_longitute)), + latitude_(flatbuffers::EndianScalar(_latitude)) { + } double longitute() const { - return GetField(VT_LONGITUTE, 0.0); + return flatbuffers::EndianScalar(longitute_); } double latitude() const { - return GetField(VT_LATITUDE, 0.0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_LONGITUTE) && - VerifyField(verifier, VT_LATITUDE) && - verifier.EndTable(); - } - PositionT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(PositionT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PositionT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct PositionBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_longitute(double longitute) { - fbb_.AddElement(Position::VT_LONGITUTE, longitute, 0.0); - } - void add_latitude(double latitude) { - fbb_.AddElement(Position::VT_LATITUDE, latitude, 0.0); - } - explicit PositionBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - PositionBuilder &operator=(const PositionBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; + return flatbuffers::EndianScalar(latitude_); } }; - -inline flatbuffers::Offset CreatePosition( - flatbuffers::FlatBufferBuilder &_fbb, - double longitute = 0.0, - double latitude = 0.0) { - PositionBuilder builder_(_fbb); - builder_.add_latitude(latitude); - builder_.add_longitute(longitute); - return builder_.Finish(); -} - -flatbuffers::Offset CreatePosition(flatbuffers::FlatBufferBuilder &_fbb, const PositionT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +FLATBUFFERS_STRUCT_END(Position, 16); struct WaypointT : public flatbuffers::NativeTable { typedef Waypoint TableType; std::string hint; double distance; std::string name; - std::unique_ptr location; + std::unique_ptr location; std::vector nodes; uint32_t matchings_index; uint32_t waypoint_index; @@ -525,7 +477,7 @@ struct Waypoint FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { return GetPointer(VT_NAME); } const osrm::engine::api::fbresult::Position *location() const { - return GetPointer(VT_LOCATION); + return GetStruct(VT_LOCATION); } const flatbuffers::Vector *nodes() const { return GetPointer *>(VT_NODES); @@ -549,8 +501,7 @@ struct Waypoint FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VerifyField(verifier, VT_DISTANCE) && VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) && - VerifyOffset(verifier, VT_LOCATION) && - verifier.VerifyTable(location()) && + VerifyField(verifier, VT_LOCATION) && VerifyOffset(verifier, VT_NODES) && verifier.VerifyVector(nodes()) && VerifyField(verifier, VT_MATCHINGS_INDEX) && @@ -576,8 +527,8 @@ struct WaypointBuilder { void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Waypoint::VT_NAME, name); } - void add_location(flatbuffers::Offset location) { - fbb_.AddOffset(Waypoint::VT_LOCATION, location); + void add_location(const osrm::engine::api::fbresult::Position *location) { + fbb_.AddStruct(Waypoint::VT_LOCATION, location); } void add_nodes(flatbuffers::Offset> nodes) { fbb_.AddOffset(Waypoint::VT_NODES, nodes); @@ -611,7 +562,7 @@ inline flatbuffers::Offset CreateWaypoint( flatbuffers::Offset hint = 0, double distance = 0.0, flatbuffers::Offset name = 0, - flatbuffers::Offset location = 0, + const osrm::engine::api::fbresult::Position *location = 0, flatbuffers::Offset> nodes = 0, uint32_t matchings_index = 0, uint32_t waypoint_index = 0, @@ -635,7 +586,7 @@ inline flatbuffers::Offset CreateWaypointDirect( const char *hint = nullptr, double distance = 0.0, const char *name = nullptr, - flatbuffers::Offset location = 0, + const osrm::engine::api::fbresult::Position *location = 0, const std::vector *nodes = nullptr, uint32_t matchings_index = 0, uint32_t waypoint_index = 0, @@ -877,7 +828,7 @@ flatbuffers::Offset CreateAnnotation(flatbuffers::FlatBufferBuilder struct StepManeuverT : public flatbuffers::NativeTable { typedef StepManeuver TableType; - std::unique_ptr location; + std::unique_ptr location; uint16_t bearing_before; uint16_t bearing_after; osrm::engine::api::fbresult::ManeuverType type; @@ -903,7 +854,7 @@ struct StepManeuver FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_EXIT = 14 }; const osrm::engine::api::fbresult::Position *location() const { - return GetPointer(VT_LOCATION); + return GetStruct(VT_LOCATION); } uint16_t bearing_before() const { return GetField(VT_BEARING_BEFORE, 0); @@ -922,8 +873,7 @@ struct StepManeuver FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_LOCATION) && - verifier.VerifyTable(location()) && + VerifyField(verifier, VT_LOCATION) && VerifyField(verifier, VT_BEARING_BEFORE) && VerifyField(verifier, VT_BEARING_AFTER) && VerifyField(verifier, VT_TYPE) && @@ -939,8 +889,8 @@ struct StepManeuver FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct StepManeuverBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_location(flatbuffers::Offset location) { - fbb_.AddOffset(StepManeuver::VT_LOCATION, location); + void add_location(const osrm::engine::api::fbresult::Position *location) { + fbb_.AddStruct(StepManeuver::VT_LOCATION, location); } void add_bearing_before(uint16_t bearing_before) { fbb_.AddElement(StepManeuver::VT_BEARING_BEFORE, bearing_before, 0); @@ -971,7 +921,7 @@ struct StepManeuverBuilder { inline flatbuffers::Offset CreateStepManeuver( flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset location = 0, + const osrm::engine::api::fbresult::Position *location = 0, uint16_t bearing_before = 0, uint16_t bearing_after = 0, osrm::engine::api::fbresult::ManeuverType type = osrm::engine::api::fbresult::ManeuverType_Turn, @@ -1068,7 +1018,7 @@ flatbuffers::Offset CreateLane(flatbuffers::FlatBufferBuilder &_fbb, const struct IntersectionT : public flatbuffers::NativeTable { typedef Intersection TableType; - std::unique_ptr location; + std::unique_ptr location; std::vector bearings; std::vector classes; std::vector entry; @@ -1093,7 +1043,7 @@ struct Intersection FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_LANES = 16 }; const osrm::engine::api::fbresult::Position *location() const { - return GetPointer(VT_LOCATION); + return GetStruct(VT_LOCATION); } const flatbuffers::Vector *bearings() const { return GetPointer *>(VT_BEARINGS); @@ -1115,8 +1065,7 @@ struct Intersection FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_LOCATION) && - verifier.VerifyTable(location()) && + VerifyField(verifier, VT_LOCATION) && VerifyOffset(verifier, VT_BEARINGS) && verifier.VerifyVector(bearings()) && VerifyOffset(verifier, VT_CLASSES) && @@ -1139,8 +1088,8 @@ struct Intersection FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct IntersectionBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_location(flatbuffers::Offset location) { - fbb_.AddOffset(Intersection::VT_LOCATION, location); + void add_location(const osrm::engine::api::fbresult::Position *location) { + fbb_.AddStruct(Intersection::VT_LOCATION, location); } void add_bearings(flatbuffers::Offset> bearings) { fbb_.AddOffset(Intersection::VT_BEARINGS, bearings); @@ -1174,7 +1123,7 @@ struct IntersectionBuilder { inline flatbuffers::Offset CreateIntersection( flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset location = 0, + const osrm::engine::api::fbresult::Position *location = 0, flatbuffers::Offset> bearings = 0, flatbuffers::Offset>> classes = 0, flatbuffers::Offset> entry = 0, @@ -1194,7 +1143,7 @@ inline flatbuffers::Offset CreateIntersection( inline flatbuffers::Offset CreateIntersectionDirect( flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset location = 0, + const osrm::engine::api::fbresult::Position *location = 0, const std::vector *bearings = nullptr, const std::vector> *classes = nullptr, const std::vector *entry = nullptr, @@ -1220,7 +1169,7 @@ flatbuffers::Offset CreateIntersection(flatbuffers::FlatBufferBuil struct PolylineT : public flatbuffers::NativeTable { typedef Polyline TableType; - std::vector> polyline; + std::vector polyline; PolylineT() { } }; @@ -1230,14 +1179,13 @@ struct Polyline FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_POLYLINE = 4 }; - const flatbuffers::Vector> *polyline() const { - return GetPointer> *>(VT_POLYLINE); + const flatbuffers::Vector *polyline() const { + return GetPointer *>(VT_POLYLINE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_POLYLINE) && verifier.VerifyVector(polyline()) && - verifier.VerifyVectorOfTables(polyline()) && verifier.EndTable(); } PolylineT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -1248,7 +1196,7 @@ struct Polyline FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct PolylineBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_polyline(flatbuffers::Offset>> polyline) { + void add_polyline(flatbuffers::Offset> polyline) { fbb_.AddOffset(Polyline::VT_POLYLINE, polyline); } explicit PolylineBuilder(flatbuffers::FlatBufferBuilder &_fbb) @@ -1265,7 +1213,7 @@ struct PolylineBuilder { inline flatbuffers::Offset CreatePolyline( flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset>> polyline = 0) { + flatbuffers::Offset> polyline = 0) { PolylineBuilder builder_(_fbb); builder_.add_polyline(polyline); return builder_.Finish(); @@ -1273,8 +1221,8 @@ inline flatbuffers::Offset CreatePolyline( inline flatbuffers::Offset CreatePolylineDirect( flatbuffers::FlatBufferBuilder &_fbb, - const std::vector> *polyline = nullptr) { - auto polyline__ = polyline ? _fbb.CreateVector>(*polyline) : 0; + const std::vector *polyline = nullptr) { + auto polyline__ = polyline ? _fbb.CreateVectorOfStructs(*polyline) : 0; return osrm::engine::api::fbresult::CreatePolyline( _fbb, polyline__); @@ -2087,77 +2035,15 @@ inline flatbuffers::Offset CreateNearestDirect( flatbuffers::Offset CreateNearest(flatbuffers::FlatBufferBuilder &_fbb, const NearestT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -struct VectorDoubleT : public flatbuffers::NativeTable { - typedef VectorDouble TableType; - std::vector column; - VectorDoubleT() { - } -}; - -struct VectorDouble FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef VectorDoubleT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_COLUMN = 4 - }; - const flatbuffers::Vector *column() const { - return GetPointer *>(VT_COLUMN); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_COLUMN) && - verifier.VerifyVector(column()) && - verifier.EndTable(); - } - VectorDoubleT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(VectorDoubleT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const VectorDoubleT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct VectorDoubleBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_column(flatbuffers::Offset> column) { - fbb_.AddOffset(VectorDouble::VT_COLUMN, column); - } - explicit VectorDoubleBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - VectorDoubleBuilder &operator=(const VectorDoubleBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateVectorDouble( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> column = 0) { - VectorDoubleBuilder builder_(_fbb); - builder_.add_column(column); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateVectorDoubleDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *column = nullptr) { - auto column__ = column ? _fbb.CreateVector(*column) : 0; - return osrm::engine::api::fbresult::CreateVectorDouble( - _fbb, - column__); -} - -flatbuffers::Offset CreateVectorDouble(flatbuffers::FlatBufferBuilder &_fbb, const VectorDoubleT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - struct TableT : public flatbuffers::NativeTable { typedef Table TableType; - std::vector> waypoints; - std::vector> durations; - std::vector> distances; + std::vector durations; + std::vector rows; + std::vector cols; + std::vector distances; std::vector> sources; std::vector> destinations; - std::vector> fallback_speed_cells; + std::vector fallback_speed_cells; TableT() { } }; @@ -2165,21 +2051,25 @@ struct TableT : public flatbuffers::NativeTable { struct Table FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TableT NativeTableType; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_WAYPOINTS = 4, - VT_DURATIONS = 6, - VT_DISTANCES = 8, - VT_SOURCES = 10, - VT_DESTINATIONS = 12, - VT_FALLBACK_SPEED_CELLS = 14 + VT_DURATIONS = 4, + VT_ROWS = 6, + VT_COLS = 8, + VT_DISTANCES = 10, + VT_SOURCES = 12, + VT_DESTINATIONS = 14, + VT_FALLBACK_SPEED_CELLS = 16 }; - const flatbuffers::Vector> *waypoints() const { - return GetPointer> *>(VT_WAYPOINTS); + const flatbuffers::Vector *durations() const { + return GetPointer *>(VT_DURATIONS); } - const flatbuffers::Vector> *durations() const { - return GetPointer> *>(VT_DURATIONS); + const flatbuffers::Vector *rows() const { + return GetPointer *>(VT_ROWS); } - const flatbuffers::Vector> *distances() const { - return GetPointer> *>(VT_DISTANCES); + const flatbuffers::Vector *cols() const { + return GetPointer *>(VT_COLS); + } + const flatbuffers::Vector *distances() const { + return GetPointer *>(VT_DISTANCES); } const flatbuffers::Vector> *sources() const { return GetPointer> *>(VT_SOURCES); @@ -2187,20 +2077,19 @@ struct Table FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const flatbuffers::Vector> *destinations() const { return GetPointer> *>(VT_DESTINATIONS); } - const flatbuffers::Vector> *fallback_speed_cells() const { - return GetPointer> *>(VT_FALLBACK_SPEED_CELLS); + const flatbuffers::Vector *fallback_speed_cells() const { + return GetPointer *>(VT_FALLBACK_SPEED_CELLS); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_WAYPOINTS) && - verifier.VerifyVector(waypoints()) && - verifier.VerifyVectorOfTables(waypoints()) && VerifyOffset(verifier, VT_DURATIONS) && verifier.VerifyVector(durations()) && - verifier.VerifyVectorOfTables(durations()) && + VerifyOffset(verifier, VT_ROWS) && + verifier.VerifyVector(rows()) && + VerifyOffset(verifier, VT_COLS) && + verifier.VerifyVector(cols()) && VerifyOffset(verifier, VT_DISTANCES) && verifier.VerifyVector(distances()) && - verifier.VerifyVectorOfTables(distances()) && VerifyOffset(verifier, VT_SOURCES) && verifier.VerifyVector(sources()) && verifier.VerifyVectorOfTables(sources()) && @@ -2209,7 +2098,6 @@ struct Table FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { verifier.VerifyVectorOfTables(destinations()) && VerifyOffset(verifier, VT_FALLBACK_SPEED_CELLS) && verifier.VerifyVector(fallback_speed_cells()) && - verifier.VerifyVectorOfTables(fallback_speed_cells()) && verifier.EndTable(); } TableT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -2220,13 +2108,16 @@ struct Table FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct TableBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_waypoints(flatbuffers::Offset>> waypoints) { - fbb_.AddOffset(Table::VT_WAYPOINTS, waypoints); - } - void add_durations(flatbuffers::Offset>> durations) { + void add_durations(flatbuffers::Offset> durations) { fbb_.AddOffset(Table::VT_DURATIONS, durations); } - void add_distances(flatbuffers::Offset>> distances) { + void add_rows(flatbuffers::Offset> rows) { + fbb_.AddOffset(Table::VT_ROWS, rows); + } + void add_cols(flatbuffers::Offset> cols) { + fbb_.AddOffset(Table::VT_COLS, cols); + } + void add_distances(flatbuffers::Offset> distances) { fbb_.AddOffset(Table::VT_DISTANCES, distances); } void add_sources(flatbuffers::Offset>> sources) { @@ -2235,7 +2126,7 @@ struct TableBuilder { void add_destinations(flatbuffers::Offset>> destinations) { fbb_.AddOffset(Table::VT_DESTINATIONS, destinations); } - void add_fallback_speed_cells(flatbuffers::Offset>> fallback_speed_cells) { + void add_fallback_speed_cells(flatbuffers::Offset> fallback_speed_cells) { fbb_.AddOffset(Table::VT_FALLBACK_SPEED_CELLS, fallback_speed_cells); } explicit TableBuilder(flatbuffers::FlatBufferBuilder &_fbb) @@ -2252,40 +2143,45 @@ struct TableBuilder { inline flatbuffers::Offset CreateTable( flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset>> waypoints = 0, - flatbuffers::Offset>> durations = 0, - flatbuffers::Offset>> distances = 0, + flatbuffers::Offset> durations = 0, + flatbuffers::Offset> rows = 0, + flatbuffers::Offset> cols = 0, + flatbuffers::Offset> distances = 0, flatbuffers::Offset>> sources = 0, flatbuffers::Offset>> destinations = 0, - flatbuffers::Offset>> fallback_speed_cells = 0) { + flatbuffers::Offset> fallback_speed_cells = 0) { TableBuilder builder_(_fbb); builder_.add_fallback_speed_cells(fallback_speed_cells); builder_.add_destinations(destinations); builder_.add_sources(sources); builder_.add_distances(distances); + builder_.add_cols(cols); + builder_.add_rows(rows); builder_.add_durations(durations); - builder_.add_waypoints(waypoints); return builder_.Finish(); } inline flatbuffers::Offset
CreateTableDirect( flatbuffers::FlatBufferBuilder &_fbb, - const std::vector> *waypoints = nullptr, - const std::vector> *durations = nullptr, - const std::vector> *distances = nullptr, + const std::vector *durations = nullptr, + const std::vector *rows = nullptr, + const std::vector *cols = nullptr, + const std::vector *distances = nullptr, const std::vector> *sources = nullptr, const std::vector> *destinations = nullptr, - const std::vector> *fallback_speed_cells = nullptr) { - auto waypoints__ = waypoints ? _fbb.CreateVector>(*waypoints) : 0; - auto durations__ = durations ? _fbb.CreateVector>(*durations) : 0; - auto distances__ = distances ? _fbb.CreateVector>(*distances) : 0; + const std::vector *fallback_speed_cells = nullptr) { + auto durations__ = durations ? _fbb.CreateVector(*durations) : 0; + auto rows__ = rows ? _fbb.CreateVector(*rows) : 0; + auto cols__ = cols ? _fbb.CreateVector(*cols) : 0; + auto distances__ = distances ? _fbb.CreateVector(*distances) : 0; auto sources__ = sources ? _fbb.CreateVector>(*sources) : 0; auto destinations__ = destinations ? _fbb.CreateVector>(*destinations) : 0; - auto fallback_speed_cells__ = fallback_speed_cells ? _fbb.CreateVector>(*fallback_speed_cells) : 0; + auto fallback_speed_cells__ = fallback_speed_cells ? _fbb.CreateVector(*fallback_speed_cells) : 0; return osrm::engine::api::fbresult::CreateTable( _fbb, - waypoints__, durations__, + rows__, + cols__, distances__, sources__, destinations__, @@ -2514,35 +2410,6 @@ inline flatbuffers::Offset CreateFBResultDirect( flatbuffers::Offset CreateFBResult(flatbuffers::FlatBufferBuilder &_fbb, const FBResultT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -inline PositionT *Position::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new PositionT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Position::UnPackTo(PositionT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = longitute(); _o->longitute = _e; }; - { auto _e = latitude(); _o->latitude = _e; }; -} - -inline flatbuffers::Offset Position::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PositionT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreatePosition(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreatePosition(flatbuffers::FlatBufferBuilder &_fbb, const PositionT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PositionT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _longitute = _o->longitute; - auto _latitude = _o->latitude; - return osrm::engine::api::fbresult::CreatePosition( - _fbb, - _longitute, - _latitude); -} - inline WaypointT *Waypoint::UnPack(const flatbuffers::resolver_function_t *_resolver) const { auto _o = new WaypointT(); UnPackTo(_o, _resolver); @@ -2555,7 +2422,7 @@ inline void Waypoint::UnPackTo(WaypointT *_o, const flatbuffers::resolver_functi { auto _e = hint(); if (_e) _o->hint = _e->str(); }; { auto _e = distance(); _o->distance = _e; }; { auto _e = name(); if (_e) _o->name = _e->str(); }; - { auto _e = location(); if (_e) _o->location = std::unique_ptr(_e->UnPack(_resolver)); }; + { auto _e = location(); if (_e) _o->location = std::unique_ptr(new osrm::engine::api::fbresult::Position(*_e)); }; { auto _e = nodes(); if (_e) { _o->nodes.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->nodes[_i] = _e->Get(_i); } } }; { auto _e = matchings_index(); _o->matchings_index = _e; }; { auto _e = waypoint_index(); _o->waypoint_index = _e; }; @@ -2574,7 +2441,7 @@ inline flatbuffers::Offset CreateWaypoint(flatbuffers::FlatBufferBuild auto _hint = _o->hint.empty() ? 0 : _fbb.CreateString(_o->hint); auto _distance = _o->distance; auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); - auto _location = _o->location ? CreatePosition(_fbb, _o->location.get(), _rehasher) : 0; + auto _location = _o->location ? _o->location.get() : 0; auto _nodes = _o->nodes.size() ? _fbb.CreateVector(_o->nodes) : 0; auto _matchings_index = _o->matchings_index; auto _waypoint_index = _o->waypoint_index; @@ -2672,7 +2539,7 @@ inline StepManeuverT *StepManeuver::UnPack(const flatbuffers::resolver_function_ inline void StepManeuver::UnPackTo(StepManeuverT *_o, const flatbuffers::resolver_function_t *_resolver) const { (void)_o; (void)_resolver; - { auto _e = location(); if (_e) _o->location = std::unique_ptr(_e->UnPack(_resolver)); }; + { auto _e = location(); if (_e) _o->location = std::unique_ptr(new osrm::engine::api::fbresult::Position(*_e)); }; { auto _e = bearing_before(); _o->bearing_before = _e; }; { auto _e = bearing_after(); _o->bearing_after = _e; }; { auto _e = type(); _o->type = _e; }; @@ -2688,7 +2555,7 @@ inline flatbuffers::Offset CreateStepManeuver(flatbuffers::FlatBuf (void)_rehasher; (void)_o; struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const StepManeuverT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _location = _o->location ? CreatePosition(_fbb, _o->location.get(), _rehasher) : 0; + auto _location = _o->location ? _o->location.get() : 0; auto _bearing_before = _o->bearing_before; auto _bearing_after = _o->bearing_after; auto _type = _o->type; @@ -2742,7 +2609,7 @@ inline IntersectionT *Intersection::UnPack(const flatbuffers::resolver_function_ inline void Intersection::UnPackTo(IntersectionT *_o, const flatbuffers::resolver_function_t *_resolver) const { (void)_o; (void)_resolver; - { auto _e = location(); if (_e) _o->location = std::unique_ptr(_e->UnPack(_resolver)); }; + { auto _e = location(); if (_e) _o->location = std::unique_ptr(new osrm::engine::api::fbresult::Position(*_e)); }; { auto _e = bearings(); if (_e) { _o->bearings.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->bearings[_i] = _e->Get(_i); } } }; { auto _e = classes(); if (_e) { _o->classes.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->classes[_i] = _e->Get(_i)->str(); } } }; { auto _e = entry(); if (_e) { _o->entry.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->entry[_i] = _e->Get(_i) != 0; } } }; @@ -2759,7 +2626,7 @@ inline flatbuffers::Offset CreateIntersection(flatbuffers::FlatBuf (void)_rehasher; (void)_o; struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const IntersectionT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _location = _o->location ? CreatePosition(_fbb, _o->location.get(), _rehasher) : 0; + auto _location = _o->location ? _o->location.get() : 0; auto _bearings = _o->bearings.size() ? _fbb.CreateVector(_o->bearings) : 0; auto _classes = _o->classes.size() ? _fbb.CreateVectorOfStrings(_o->classes) : 0; auto _entry = _o->entry.size() ? _fbb.CreateVector(_o->entry) : 0; @@ -2786,7 +2653,7 @@ inline PolylineT *Polyline::UnPack(const flatbuffers::resolver_function_t *_reso inline void Polyline::UnPackTo(PolylineT *_o, const flatbuffers::resolver_function_t *_resolver) const { (void)_o; (void)_resolver; - { auto _e = polyline(); if (_e) { _o->polyline.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->polyline[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; + { auto _e = polyline(); if (_e) { _o->polyline.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->polyline[_i] = *_e->Get(_i); } } }; } inline flatbuffers::Offset Polyline::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PolylineT* _o, const flatbuffers::rehasher_function_t *_rehasher) { @@ -2797,7 +2664,7 @@ inline flatbuffers::Offset CreatePolyline(flatbuffers::FlatBufferBuild (void)_rehasher; (void)_o; struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PolylineT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _polyline = _o->polyline.size() ? _fbb.CreateVector> (_o->polyline.size(), [](size_t i, _VectorArgs *__va) { return CreatePosition(*__va->__fbb, __va->__o->polyline[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _polyline = _o->polyline.size() ? _fbb.CreateVectorOfStructs(_o->polyline) : 0; return osrm::engine::api::fbresult::CreatePolyline( _fbb, _polyline); @@ -3043,32 +2910,6 @@ inline flatbuffers::Offset CreateNearest(flatbuffers::FlatBufferBuilder _waypoints); } -inline VectorDoubleT *VectorDouble::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new VectorDoubleT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void VectorDouble::UnPackTo(VectorDoubleT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = column(); if (_e) { _o->column.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->column[_i] = _e->Get(_i); } } }; -} - -inline flatbuffers::Offset VectorDouble::Pack(flatbuffers::FlatBufferBuilder &_fbb, const VectorDoubleT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateVectorDouble(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateVectorDouble(flatbuffers::FlatBufferBuilder &_fbb, const VectorDoubleT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const VectorDoubleT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _column = _o->column.size() ? _fbb.CreateVector(_o->column) : 0; - return osrm::engine::api::fbresult::CreateVectorDouble( - _fbb, - _column); -} - inline TableT *Table::UnPack(const flatbuffers::resolver_function_t *_resolver) const { auto _o = new TableT(); UnPackTo(_o, _resolver); @@ -3078,12 +2919,13 @@ inline TableT *Table::UnPack(const flatbuffers::resolver_function_t *_resolver) inline void Table::UnPackTo(TableT *_o, const flatbuffers::resolver_function_t *_resolver) const { (void)_o; (void)_resolver; - { auto _e = waypoints(); if (_e) { _o->waypoints.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->waypoints[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; - { auto _e = durations(); if (_e) { _o->durations.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->durations[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; - { auto _e = distances(); if (_e) { _o->distances.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->distances[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; + { auto _e = durations(); if (_e) { _o->durations.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->durations[_i] = _e->Get(_i); } } }; + { auto _e = rows(); if (_e) { _o->rows.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->rows[_i] = _e->Get(_i); } } }; + { auto _e = cols(); if (_e) { _o->cols.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->cols[_i] = _e->Get(_i); } } }; + { auto _e = distances(); if (_e) { _o->distances.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->distances[_i] = _e->Get(_i); } } }; { auto _e = sources(); if (_e) { _o->sources.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->sources[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; { auto _e = destinations(); if (_e) { _o->destinations.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->destinations[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; - { auto _e = fallback_speed_cells(); if (_e) { _o->fallback_speed_cells.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->fallback_speed_cells[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; + { auto _e = fallback_speed_cells(); if (_e) { _o->fallback_speed_cells.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->fallback_speed_cells[_i] = _e->Get(_i); } } }; } inline flatbuffers::Offset
Table::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableT* _o, const flatbuffers::rehasher_function_t *_rehasher) { @@ -3094,16 +2936,18 @@ inline flatbuffers::Offset
CreateTable(flatbuffers::FlatBufferBuilder &_f (void)_rehasher; (void)_o; struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TableT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _waypoints = _o->waypoints.size() ? _fbb.CreateVector> (_o->waypoints.size(), [](size_t i, _VectorArgs *__va) { return CreateWaypoint(*__va->__fbb, __va->__o->waypoints[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _durations = _o->durations.size() ? _fbb.CreateVector> (_o->durations.size(), [](size_t i, _VectorArgs *__va) { return CreateVectorDouble(*__va->__fbb, __va->__o->durations[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _distances = _o->distances.size() ? _fbb.CreateVector> (_o->distances.size(), [](size_t i, _VectorArgs *__va) { return CreateVectorDouble(*__va->__fbb, __va->__o->distances[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _durations = _o->durations.size() ? _fbb.CreateVector(_o->durations) : 0; + auto _rows = _o->rows.size() ? _fbb.CreateVector(_o->rows) : 0; + auto _cols = _o->cols.size() ? _fbb.CreateVector(_o->cols) : 0; + auto _distances = _o->distances.size() ? _fbb.CreateVector(_o->distances) : 0; auto _sources = _o->sources.size() ? _fbb.CreateVector> (_o->sources.size(), [](size_t i, _VectorArgs *__va) { return CreateWaypoint(*__va->__fbb, __va->__o->sources[i].get(), __va->__rehasher); }, &_va ) : 0; auto _destinations = _o->destinations.size() ? _fbb.CreateVector> (_o->destinations.size(), [](size_t i, _VectorArgs *__va) { return CreateWaypoint(*__va->__fbb, __va->__o->destinations[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _fallback_speed_cells = _o->fallback_speed_cells.size() ? _fbb.CreateVector> (_o->fallback_speed_cells.size(), [](size_t i, _VectorArgs *__va) { return CreateVectorDouble(*__va->__fbb, __va->__o->fallback_speed_cells[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _fallback_speed_cells = _o->fallback_speed_cells.size() ? _fbb.CreateVector(_o->fallback_speed_cells) : 0; return osrm::engine::api::fbresult::CreateTable( _fbb, - _waypoints, _durations, + _rows, + _cols, _distances, _sources, _destinations, diff --git a/include/engine/api/flatbuffers/position.fbs b/include/engine/api/flatbuffers/position.fbs index 4793e863d..f1576c5b8 100644 --- a/include/engine/api/flatbuffers/position.fbs +++ b/include/engine/api/flatbuffers/position.fbs @@ -1,6 +1,6 @@ namespace osrm.engine.api.fbresult; -table Position { +struct Position { longitute: double; latitude: double; } \ No newline at end of file diff --git a/include/engine/api/flatbuffers/table.fbs b/include/engine/api/flatbuffers/table.fbs index e0c685ee2..1bbbc57e9 100644 --- a/include/engine/api/flatbuffers/table.fbs +++ b/include/engine/api/flatbuffers/table.fbs @@ -1,15 +1,12 @@ include "waypoint.fbs"; namespace osrm.engine.api.fbresult; -table VectorDouble { - column: [double]; -} - table Table { - waypoints: [Waypoint]; - durations: [VectorDouble]; - distances: [VectorDouble]; + durations: [float]; + rows: [ushort]; + cols: [ushort]; + distances: [float]; sources: [Waypoint]; destinations: [Waypoint]; - fallback_speed_cells: [VectorDouble]; + fallback_speed_cells: [uint]; } \ No newline at end of file diff --git a/include/engine/api/table_api.hpp b/include/engine/api/table_api.hpp index 582a925f6..7589ca001 100644 --- a/include/engine/api/table_api.hpp +++ b/include/engine/api/table_api.hpp @@ -96,14 +96,16 @@ class TableAPI final : public BaseAPI table.add_destinations(MakeWaypoints(fb_result, phantoms, parameters.destinations)); } + table.add_rows(number_of_sources); + table.add_cols(number_of_destinations); if (parameters.annotations & TableParameters::AnnotationsType::Duration) { - table.add_durations(MakeDurationTable(fb_result, tables.first, number_of_sources, number_of_destinations)); + table.add_durations(MakeDurationTable(fb_result, tables.first)); } if (parameters.annotations & TableParameters::AnnotationsType::Distance) { - table.add_distances(MakeDistanceTable(fb_result, tables.second, number_of_sources, number_of_destinations)); + table.add_distances(MakeDistanceTable(fb_result, tables.second)); } if (parameters.fallback_speed != INVALID_FALLBACK_SPEED && parameters.fallback_speed > 0) @@ -195,74 +197,45 @@ class TableAPI final : public BaseAPI return builder.CreateVector(waypoints); } - virtual flatbuffers::Offset>> + virtual flatbuffers::Offset> MakeDurationTable(flatbuffers::FlatBufferBuilder& builder, - const std::vector &values, - std::size_t number_of_rows, - std::size_t number_of_columns) const + const std::vector &values) const { - std::vector> fb_table; - for (const auto row : util::irange(0UL, number_of_rows)) - { - std::vector fb_row; - auto row_begin_iterator = values.begin() + (row * number_of_columns); - auto row_end_iterator = values.begin() + ((row + 1) * number_of_columns); - fb_row.resize(number_of_columns); - std::transform(row_begin_iterator, - row_end_iterator, - fb_row.begin(), - [](const EdgeWeight duration) -> double { - if (duration == MAXIMAL_EDGE_DURATION) - { - return MAXIMAL_EDGE_DURATION; - } - // division by 10 because the duration is in deciseconds (10s) - return duration / 10.; - }); - fb_table.push_back(fbresult::CreateVectorDoubleDirect(builder, &fb_row)); - } - return builder.CreateVector(fb_table); + std::vector distance_table; + distance_table.resize(values.size()); + std::transform(values.begin(), values.end(), distance_table.begin(), [](const EdgeWeight duration) { + if (duration == MAXIMAL_EDGE_DURATION) { + return 0.; + } + return duration / 10.; + }); + return builder.CreateVector(distance_table); } - virtual flatbuffers::Offset>> + virtual flatbuffers::Offset> MakeDistanceTable(flatbuffers::FlatBufferBuilder& builder, - const std::vector &values, - std::size_t number_of_rows, - std::size_t number_of_columns) const + const std::vector &values) const { - std::vector> fb_table; - for (const auto row : util::irange(0UL, number_of_rows)) - { - std::vector fb_row; - auto row_begin_iterator = values.begin() + (row * number_of_columns); - auto row_end_iterator = values.begin() + ((row + 1) * number_of_columns); - fb_row.resize(number_of_columns); - std::transform(row_begin_iterator, - row_end_iterator, - fb_row.begin(), - [](const EdgeDistance distance) -> double { - if (distance == INVALID_EDGE_DISTANCE) { - return INVALID_EDGE_DISTANCE; - } - // round to single decimal place - return std::round(distance * 10) / 10.; - }); - fb_table.push_back(fbresult::CreateVectorDoubleDirect(builder, &fb_row)); - } - return builder.CreateVector(fb_table); + std::vector duration_table; + duration_table.resize(values.size()); + std::transform(values.begin(), values.end(), duration_table.begin(), [](const EdgeDistance distance) { + if (distance == INVALID_EDGE_DISTANCE) { + return 0.; + } + return std::round(distance * 10) / 10.; + }); + return builder.CreateVector(duration_table); } - virtual flatbuffers::Offset>> + virtual flatbuffers::Offset> MakeEstimatesTable(flatbuffers::FlatBufferBuilder& builder, const std::vector &fallback_speed_cells) const { - std::vector> fb_table; + std::vector fb_table; fb_table.reserve(fallback_speed_cells.size()); std::for_each( fallback_speed_cells.begin(), fallback_speed_cells.end(), [&](const auto &cell) { - std::vector fb_row; - fb_row.push_back(cell.row); - fb_row.push_back(cell.column); - fb_table.push_back(fbresult::CreateVectorDoubleDirect(builder, &fb_row)); + fb_table.push_back(cell.row); + fb_table.push_back(cell.column); }); return builder.CreateVector(fb_table); }