From ee47afbe17ba515de785c92a06cf10a150fd0821 Mon Sep 17 00:00:00 2001 From: Moritz Kobitzsch Date: Tue, 19 Jul 2016 12:24:32 +0200 Subject: [PATCH] fix 2672 --- CHANGELOG.md | 5 +++++ .../engine/datafacade/internal_datafacade.hpp | 2 +- include/util/guidance/entry_class.hpp | 7 +++++++ src/extractor/extractor.cpp | 17 +++++++++-------- src/storage/storage.cpp | 2 +- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1724e230f..314a8c159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 5.3.0 + Changes from 5.3.0-rc.3 + - Bugfixes + - Fix BREAKING: bug that could result in failure to load 'osrm.icd' files. This breaks the dataformat + # 5.3.0 RC3 Changes from 5.3.0-rc.2 - Guidance diff --git a/include/engine/datafacade/internal_datafacade.hpp b/include/engine/datafacade/internal_datafacade.hpp index 7123f9c63..92c2c7eb7 100644 --- a/include/engine/datafacade/internal_datafacade.hpp +++ b/include/engine/datafacade/internal_datafacade.hpp @@ -360,7 +360,7 @@ class InternalDataFacade final : public BaseDataFacade std::vector bearing_classes; // and the actual bearing values std::uint64_t num_bearings; - intersection_stream >> num_bearings; + intersection_stream.read(reinterpret_cast(&num_bearings),sizeof(num_bearings)); m_bearing_values_table.resize(num_bearings); intersection_stream.read(reinterpret_cast(&m_bearing_values_table[0]), sizeof(m_bearing_values_table[0]) * num_bearings); diff --git a/include/util/guidance/entry_class.hpp b/include/util/guidance/entry_class.hpp index 422c2d20e..715e12395 100644 --- a/include/util/guidance/entry_class.hpp +++ b/include/util/guidance/entry_class.hpp @@ -62,6 +62,13 @@ class EntryClass friend std::size_t std::hash::operator()(const EntryClass &) const; }; +#if not defined __GNUC__ or __GNUC__ > 4 +static_assert(std::is_trivially_copyable::value, + "Class is serialized trivially in " + "the datafacades. Bytewise writing " + "requires trivially copyable type"); +#endif + } // namespace guidance } // namespace utilr } // namespace osrm diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index 78015b1ac..45ed06e91 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -507,8 +507,8 @@ Extractor::BuildEdgeExpandedGraph(lua_State *lua_state, std::vector turn_lane_offsets; std::vector turn_lane_masks; - if( !util::deserializeAdjacencyArray( - config.turn_lane_descriptions_file_name, turn_lane_offsets, turn_lane_masks) ) + if (!util::deserializeAdjacencyArray( + config.turn_lane_descriptions_file_name, turn_lane_offsets, turn_lane_masks)) { util::SimpleLogger().Write(logWARNING) << "Reading Turn Lane Masks failed."; } @@ -673,7 +673,7 @@ void Extractor::WriteIntersectionClassificationData( util::RangeTable<> bearing_class_range_table(bearing_counts); file_out_stream << bearing_class_range_table; - file_out_stream << total_bearings; + file_out_stream.write(reinterpret_cast(&total_bearings), sizeof(total_bearings)); for (const auto &bearing_class : bearing_classes) { const auto &bearings = bearing_class.getAvailableBearings(); @@ -681,17 +681,18 @@ void Extractor::WriteIntersectionClassificationData( sizeof(bearings[0]) * bearings.size()); } - // FIXME - // This should be here, but g++4.8 does not have it... - // static_assert(std::is_trivially_copyable::value, - // "EntryClass Serialization requires trivial copyable entry classes"); + if (!static_cast(file_out_stream)) + { + throw util::exception("Failed to write to " + output_file_name + "."); + } util::serializeVector(file_out_stream, entry_classes); TIMER_STOP(write_edges); util::SimpleLogger().Write() << "ok, after " << TIMER_SEC(write_edges) << "s for " << node_based_intersection_classes.size() << " Indices into " << bearing_classes.size() << " bearing classes and " - << entry_classes.size() << " entry classes"; + << entry_classes.size() << " entry classes and " << total_bearings + << " bearing values." << std::endl; } } } diff --git a/src/storage/storage.cpp b/src/storage/storage.cpp index 5f245cd4c..119549db9 100644 --- a/src/storage/storage.cpp +++ b/src/storage/storage.cpp @@ -375,7 +375,7 @@ int Storage::Run() } std::uint64_t num_bearings; - intersection_stream >> num_bearings; + intersection_stream.read(reinterpret_cast(&num_bearings),sizeof(num_bearings)); std::vector bearing_class_table(num_bearings); intersection_stream.read(reinterpret_cast(&bearing_class_table[0]),