osrm-backend/include/util/serialization.hpp

151 lines
5.8 KiB
C++
Raw Normal View History

2017-04-02 13:15:20 -04:00
#ifndef OSMR_UTIL_SERIALIZATION_HPP
#define OSMR_UTIL_SERIALIZATION_HPP
2017-04-04 19:01:00 -04:00
#include "util/dynamic_graph.hpp"
2018-03-22 14:26:40 -04:00
#include "util/indexed_data.hpp"
#include "util/packed_vector.hpp"
2017-06-19 09:27:46 -04:00
#include "util/range_table.hpp"
2017-04-02 13:15:20 -04:00
#include "util/static_graph.hpp"
#include "util/static_rtree.hpp"
2017-04-02 13:15:20 -04:00
#include "storage/io.hpp"
#include "storage/serialization.hpp"
2017-04-02 13:15:20 -04:00
namespace osrm
{
namespace util
{
namespace serialization
{
2017-06-19 09:27:46 -04:00
2018-03-16 12:39:18 -04:00
template <unsigned BlockSize, storage::Ownership Ownership>
2018-03-19 08:12:20 -04:00
void write(storage::tar::FileWriter &writer,
const std::string &name,
const util::RangeTable<BlockSize, Ownership> &table)
2018-03-16 12:39:18 -04:00
{
writer.WriteFrom(name + "/sum_lengths.meta", table.sum_lengths);
2018-03-16 12:39:18 -04:00
storage::serialization::write(writer, name + "/block_offsets", table.block_offsets);
storage::serialization::write(writer, name + "/diff_blocks", table.diff_blocks);
}
template <unsigned BlockSize, storage::Ownership Ownership>
2018-03-19 08:12:20 -04:00
void read(storage::tar::FileReader &reader,
const std::string &name,
util::RangeTable<BlockSize, Ownership> &table)
2018-03-16 12:39:18 -04:00
{
reader.ReadInto(name + "/sum_lengths.meta", table.sum_lengths);
2018-03-16 12:39:18 -04:00
storage::serialization::read(reader, name + "/block_offsets", table.block_offsets);
storage::serialization::read(reader, name + "/diff_blocks", table.diff_blocks);
}
2018-03-19 08:12:20 -04:00
template <typename T, std::size_t Bits, storage::Ownership Ownership>
inline void read(storage::tar::FileReader &reader,
const std::string &name,
detail::PackedVector<T, Bits, Ownership> &vec)
{
reader.ReadInto(name + "/number_of_elements.meta", vec.num_elements);
2018-03-19 08:12:20 -04:00
storage::serialization::read(reader, name + "/packed", vec.vec);
}
template <typename T, std::size_t Bits, storage::Ownership Ownership>
inline void write(storage::tar::FileWriter &writer,
const std::string &name,
const detail::PackedVector<T, Bits, Ownership> &vec)
{
writer.WriteFrom(name + "/number_of_elements.meta", vec.num_elements);
2018-03-19 08:12:20 -04:00
storage::serialization::write(writer, name + "/packed", vec.vec);
}
2018-03-15 16:10:21 -04:00
template <typename EdgeDataT, storage::Ownership Ownership>
inline void read(storage::tar::FileReader &reader,
const std::string &name,
StaticGraph<EdgeDataT, Ownership> &graph)
{
storage::serialization::read(reader, name + "/node_array", graph.node_array);
storage::serialization::read(reader, name + "/edge_array", graph.edge_array);
graph.number_of_nodes = graph.node_array.size() - 1;
graph.number_of_edges = graph.edge_array.size();
}
template <typename EdgeDataT, storage::Ownership Ownership>
inline void write(storage::tar::FileWriter &writer,
const std::string &name,
const StaticGraph<EdgeDataT, Ownership> &graph)
{
storage::serialization::write(writer, name + "/node_array", graph.node_array);
storage::serialization::write(writer, name + "/edge_array", graph.edge_array);
}
template <typename EdgeDataT>
inline void
read(storage::tar::FileReader &reader, const std::string &name, DynamicGraph<EdgeDataT> &graph)
{
storage::serialization::read(reader, name + "/node_array", graph.node_array);
const auto num_edges = reader.ReadElementCount64(name + "/edge_list");
graph.edge_list.resize(num_edges);
reader.ReadStreaming<typename std::remove_reference_t<decltype(graph)>::Edge>(
name + "/edge_list", graph.edge_list.begin());
graph.number_of_nodes = graph.node_array.size();
graph.number_of_edges = num_edges;
}
template <typename EdgeDataT>
inline void write(storage::tar::FileWriter &writer,
const std::string &name,
const DynamicGraph<EdgeDataT> &graph)
{
storage::serialization::write(writer, name + "/node_array", graph.node_array);
writer.WriteElementCount64(name + "/edge_list", graph.number_of_edges);
writer.WriteStreaming<typename std::remove_reference_t<decltype(graph)>::Edge>(
name + "/edge_list", graph.edge_list.begin(), graph.number_of_edges);
}
2018-03-21 07:10:02 -04:00
template <typename BlockPolicy, storage::Ownership Ownership>
2018-03-22 14:26:40 -04:00
inline void read(storage::tar::FileReader &reader,
const std::string &name,
detail::IndexedDataImpl<BlockPolicy, Ownership> &index_data)
2018-03-21 07:10:02 -04:00
{
storage::serialization::read(reader, name + "/blocks", index_data.blocks);
storage::serialization::read(reader, name + "/values", index_data.values);
}
template <typename BlockPolicy, storage::Ownership Ownership>
inline void write(storage::tar::FileWriter &writer,
2018-03-22 14:26:40 -04:00
const std::string &name,
const detail::IndexedDataImpl<BlockPolicy, Ownership> &index_data)
2018-03-21 07:10:02 -04:00
{
storage::serialization::write(writer, name + "/blocks", index_data.blocks);
storage::serialization::write(writer, name + "/values", index_data.values);
}
template <class EdgeDataT,
storage::Ownership Ownership,
std::uint32_t BRANCHING_FACTOR,
std::uint32_t LEAF_PAGE_SIZE>
2018-03-22 14:26:40 -04:00
void read(storage::tar::FileReader &reader,
const std::string &name,
util::StaticRTree<EdgeDataT, Ownership, BRANCHING_FACTOR, LEAF_PAGE_SIZE> &rtree)
{
storage::serialization::read(reader, name + "/search_tree", rtree.m_search_tree);
2018-03-22 14:26:40 -04:00
storage::serialization::read(
reader, name + "/search_tree_level_starts", rtree.m_tree_level_starts);
}
template <class EdgeDataT,
storage::Ownership Ownership,
std::uint32_t BRANCHING_FACTOR,
std::uint32_t LEAF_PAGE_SIZE>
2018-03-22 14:26:40 -04:00
void write(storage::tar::FileWriter &writer,
const std::string &name,
const util::StaticRTree<EdgeDataT, Ownership, BRANCHING_FACTOR, LEAF_PAGE_SIZE> &rtree)
{
storage::serialization::write(writer, name + "/search_tree", rtree.m_search_tree);
2018-03-22 14:26:40 -04:00
storage::serialization::write(
writer, name + "/search_tree_level_starts", rtree.m_tree_level_starts);
}
} // namespace serialization
} // namespace util
} // namespace osrm
2017-04-02 13:15:20 -04:00
#endif