#ifndef OSRM_CONTRACTOR_FILES_HPP #define OSRM_CONTRACTOR_FILES_HPP #include "contractor/query_graph.hpp" #include "util/serialization.hpp" #include "storage/tar.hpp" #include "storage/serialization.hpp" namespace osrm { namespace contractor { namespace files { // reads .osrm.hsgr file template inline void readGraph(const boost::filesystem::path &path, unsigned &checksum, QueryGraphT &graph, std::vector &edge_filter, std::uint32_t &connectivity_checksum) { static_assert(std::is_same::value || std::is_same::value, "graph must be of type QueryGraph<>"); static_assert(std::is_same>::value || std::is_same>::value, "edge_filter must be a container of vector or vector_view"); const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; storage::tar::FileReader reader{path, fingerprint}; checksum = reader.ReadOne("/ch/checksum"); util::serialization::read(reader, "/ch/contracted_graph", graph); auto count = reader.ReadElementCount64("/ch/edge_filter"); edge_filter.resize(count); for (const auto index : util::irange(0, count)) { storage::serialization::read(reader, "/ch/edge_filter/" + std::to_string(index), edge_filter[index]); } connectivity_checksum = reader.ReadOne("/ch/connectivity_checksum"); } // writes .osrm.hsgr file template inline void writeGraph(const boost::filesystem::path &path, unsigned checksum, const QueryGraphT &graph, const std::vector &edge_filter, const std::uint32_t connectivity_checksum) { static_assert(std::is_same::value || std::is_same::value, "graph must be of type QueryGraph<>"); static_assert(std::is_same>::value || std::is_same>::value, "edge_filter must be a container of vector or vector_view"); const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; storage::tar::FileWriter writer{path, fingerprint}; writer.WriteElementCount64("/ch/checksum", 1); writer.WriteOne("/ch/checksum", checksum); util::serialization::write(writer, "/ch/contracted_graph", graph); writer.WriteElementCount64("/ch/edge_filter", edge_filter.size()); auto id = 0; for (const auto &filter : edge_filter) { storage::serialization::write(writer, "/ch/edge_filter/" + std::to_string(id++), filter); } writer.WriteElementCount64("/ch/connectivity_checksum", 1); writer.WriteOne("/ch/connectivity_checksum", connectivity_checksum); } } } } #endif