diff --git a/include/util/dynamic_graph.hpp b/include/util/dynamic_graph.hpp index ab588c620..c62bc1753 100644 --- a/include/util/dynamic_graph.hpp +++ b/include/util/dynamic_graph.hpp @@ -17,8 +17,28 @@ namespace osrm { +namespace storage +{ +namespace io +{ +class FileReader; +class FileWriter; +} +} + namespace util { +template class DynamicGraph; + +namespace serialization +{ +template +void read(storage::io::FileReader &reader, DynamicGraph &graph); + +template +void write(storage::io::FileWriter &writer, + const DynamicGraph &graph); +} template class DynamicGraph { diff --git a/include/util/serialization.hpp b/include/util/serialization.hpp new file mode 100644 index 000000000..f41a8818c --- /dev/null +++ b/include/util/serialization.hpp @@ -0,0 +1,59 @@ +#ifndef OSMR_UTIL_SERIALIZATION_HPP +#define OSMR_UTIL_SERIALIZATION_HPP + +#include "util/static_graph.hpp" +#include "util/dynamic_graph.hpp" +#include "storage/io.hpp" + +namespace osrm +{ +namespace util +{ + +template +inline void read(storage::io::FileReader &reader, + StaticGraph &graph) +{ + reader.DeserializeVector(graph.node_array); + reader.DeserializeVector(graph.edge_array); +} + +template +inline void write(storage::io::FileWriter &writer, + StaticGraph &graph) +{ + writer.SerializeVector(graph.node_array); + writer.SerializeVector(graph.edge_array); +} + +template +inline void read(storage::io::FileReader &reader, + DynamicGraph &graph) +{ + reader.DeserializeVector(graph.node_array); + auto num_edges = reader.ReadElementCount64(); + graph.edge_list.resize(num_edges); + for (auto index : irange(0, num_edges)) + { + reader.ReadOne(graph.edge_list[index]); + } + graph.number_of_nodes = graph.node_array.size(); + graph.number_of_edges = num_edges; +} + +template +inline void write(storage::io::FileWriter &writer, + DynamicGraph &graph) +{ + writer.SerializeVector(graph.node_array); + writer.WriteElementCount64(graph.number_of_edges); + for (auto index : irange(0, graph.number_of_edges)) + { + writer.WriteOne(graph.edge_list[index]); + } +} + +} +} + +#endif diff --git a/include/util/static_graph.hpp b/include/util/static_graph.hpp index 133c9140f..e542cff9a 100644 --- a/include/util/static_graph.hpp +++ b/include/util/static_graph.hpp @@ -19,8 +19,28 @@ namespace osrm { + +namespace storage +{ +namespace io +{ +class FileReader; +class FileWriter; +} +} + namespace util { +template class StaticGraph; + +namespace serialization +{ +template +void read(storage::io::FileReader &reader, StaticGraph &graph); + +template +void write(storage::io::FileWriter &writer, const StaticGraph &graph); +} namespace static_graph_details { @@ -102,6 +122,8 @@ EntryT edgeToEntry(const OtherEdge &from, std::false_type) template class StaticGraph { + template using Vector = typename util::ShM::vector; + public: using InputEdge = static_graph_details::SortableEdgeWithData; using NodeIterator = static_graph_details::NodeIterator; @@ -125,8 +147,7 @@ class StaticGraph InitializeFromSortedEdgeRange(nodes, edges.begin(), edges.end()); } - StaticGraph(typename util::ShM::vector node_array_, - typename util::ShM::vector edge_array_) + StaticGraph(Vector node_array_, Vector edge_array_) : node_array(std::move(node_array_)), edge_array(std::move(edge_array_)) { BOOST_ASSERT(!node_array.empty()); @@ -229,8 +250,12 @@ class StaticGraph return current_iterator; } - const NodeArrayEntry &GetNode(const NodeID nid) const { return node_array[nid]; } - const EdgeArrayEntry &GetEdge(const EdgeID eid) const { return edge_array[eid]; } + friend void serialization::read(storage::io::FileReader &reader, + StaticGraph &graph); + friend void + serialization::write(storage::io::FileWriter &writer, + const StaticGraph &graph); + protected: template void InitializeFromSortedEdgeRange(const unsigned nodes, IterT begin, IterT end) @@ -261,8 +286,8 @@ class StaticGraph NodeIterator number_of_nodes; EdgeIterator number_of_edges; - typename ShM::vector node_array; - typename ShM::vector edge_array; + Vector node_array; + Vector edge_array; }; } // namespace util