#ifndef OSRM_CUSTOMIZE_EDGE_BASED_GRAPH_HPP #define OSRM_CUSTOMIZE_EDGE_BASED_GRAPH_HPP #include "extractor/edge_based_edge.hpp" #include "partitioner/edge_based_graph.hpp" #include "partitioner/multi_level_graph.hpp" #include "util/static_graph.hpp" #include "util/typedefs.hpp" #include "storage/shared_memory_ownership.hpp" #include namespace osrm { namespace customizer { struct EdgeBasedGraphEdgeData { NodeID turn_id; // ID of the edge based node (node based edge) }; template class MultiLevelGraph; namespace serialization { template void read(storage::tar::FileReader &reader, const std::string &name, MultiLevelGraph &graph); template void write(storage::tar::FileWriter &writer, const std::string &name, const MultiLevelGraph &graph); } template class MultiLevelGraph : public partitioner::MultiLevelGraph { private: using SuperT = partitioner::MultiLevelGraph; using PartitionerGraphT = partitioner::MultiLevelGraph; template using Vector = util::ViewOrVector; public: using NodeArrayEntry = typename SuperT::NodeArrayEntry; using EdgeArrayEntry = typename SuperT::EdgeArrayEntry; using EdgeOffset = typename SuperT::EdgeOffset; MultiLevelGraph() = default; MultiLevelGraph(MultiLevelGraph &&) = default; MultiLevelGraph(const MultiLevelGraph &) = default; MultiLevelGraph &operator=(MultiLevelGraph &&) = default; MultiLevelGraph &operator=(const MultiLevelGraph &) = default; MultiLevelGraph(PartitionerGraphT &&graph, Vector node_weights_, Vector node_durations_, Vector node_distances_) : node_weights(std::move(node_weights_)), node_durations(std::move(node_durations_)), node_distances(std::move(node_distances_)) { util::ViewOrVector original_edge_array; std::tie(SuperT::node_array, original_edge_array, SuperT::node_to_edge_offset, SuperT::connectivity_checksum) = std::move(graph).data(); SuperT::edge_array.reserve(original_edge_array.size()); for (const auto &edge : original_edge_array) { SuperT::edge_array.push_back({edge.target, {edge.data.turn_id}}); is_forward_edge.push_back(edge.data.forward); is_backward_edge.push_back(edge.data.backward); } } MultiLevelGraph(Vector node_array_, Vector edge_array_, Vector node_to_edge_offset_, Vector node_weights_, Vector node_durations_, Vector node_distances_, Vector is_forward_edge_, Vector is_backward_edge_) : SuperT(std::move(node_array_), std::move(edge_array_), std::move(node_to_edge_offset_)), node_weights(std::move(node_weights_)), node_durations(std::move(node_durations_)), node_distances(std::move(node_distances_)), is_forward_edge(is_forward_edge_), is_backward_edge(is_backward_edge_) { } EdgeWeight GetNodeWeight(NodeID node) const { return node_weights[node]; } EdgeWeight GetNodeDuration(NodeID node) const { return node_durations[node]; } EdgeDistance GetNodeDistance(NodeID node) const { return node_distances[node]; } bool IsForwardEdge(EdgeID edge) const { return is_forward_edge[edge]; } bool IsBackwardEdge(EdgeID edge) const { return is_backward_edge[edge]; } friend void serialization::read(storage::tar::FileReader &reader, const std::string &name, MultiLevelGraph &graph); friend void serialization::write(storage::tar::FileWriter &writer, const std::string &name, const MultiLevelGraph &graph); protected: Vector node_weights; Vector node_durations; Vector node_distances; Vector is_forward_edge; Vector is_backward_edge; }; using MultiLevelEdgeBasedGraph = MultiLevelGraph; using MultiLevelEdgeBasedGraphView = MultiLevelGraph; } } #endif