1 #ifndef OSRM_EXTRACTOR_NODE_DATA_CONTAINER_HPP 2 #define OSRM_EXTRACTOR_NODE_DATA_CONTAINER_HPP 3 4 #include "extractor/class_data.hpp" 5 #include "extractor/edge_based_node.hpp" 6 #include "extractor/node_based_edge.hpp" 7 #include "extractor/travel_mode.hpp" 8 9 #include "storage/shared_memory_ownership.hpp" 10 #include "storage/tar_fwd.hpp" 11 12 #include "util/permutation.hpp" 13 #include "util/typedefs.hpp" 14 #include "util/vector_view.hpp" 15 16 namespace osrm 17 { 18 namespace extractor 19 { 20 21 class Extractor; 22 class EdgeBasedGraphFactory; 23 24 namespace detail 25 { 26 template <storage::Ownership Ownership> class EdgeBasedNodeDataContainerImpl; 27 } 28 29 namespace serialization 30 { 31 template <storage::Ownership Ownership> 32 void read(storage::tar::FileReader &reader, 33 const std::string &name, 34 detail::EdgeBasedNodeDataContainerImpl<Ownership> &ebn_data); 35 36 template <storage::Ownership Ownership> 37 void write(storage::tar::FileWriter &writer, 38 const std::string &name, 39 const detail::EdgeBasedNodeDataContainerImpl<Ownership> &ebn_data); 40 } // namespace serialization 41 42 namespace detail 43 { 44 template <storage::Ownership Ownership> class EdgeBasedNodeDataContainerImpl 45 { 46 template <typename T> using Vector = util::ViewOrVector<T, Ownership>; 47 using TravelMode = extractor::TravelMode; 48 49 // to fill in data on edgeBasedNodes 50 friend class osrm::extractor::Extractor; 51 friend class osrm::extractor::EdgeBasedGraphFactory; 52 53 public: 54 EdgeBasedNodeDataContainerImpl() = default; 55 EdgeBasedNodeDataContainerImpl(const NodeID number_of_edge_based_nodes,const AnnotationID number_of_annotations)56 EdgeBasedNodeDataContainerImpl(const NodeID number_of_edge_based_nodes, 57 const AnnotationID number_of_annotations) 58 : nodes(number_of_edge_based_nodes), annotation_data(number_of_annotations) 59 { 60 } 61 EdgeBasedNodeDataContainerImpl(Vector<EdgeBasedNode> nodes,Vector<NodeBasedEdgeAnnotation> annotation_data)62 EdgeBasedNodeDataContainerImpl(Vector<EdgeBasedNode> nodes, 63 Vector<NodeBasedEdgeAnnotation> annotation_data) 64 : nodes(std::move(nodes)), annotation_data(std::move(annotation_data)) 65 { 66 } 67 GetGeometryID(const NodeID node_id) const68 GeometryID GetGeometryID(const NodeID node_id) const { return nodes[node_id].geometry_id; } 69 GetComponentID(const NodeID node_id) const70 ComponentID GetComponentID(const NodeID node_id) const { return nodes[node_id].component_id; } 71 GetTravelMode(const NodeID node_id) const72 TravelMode GetTravelMode(const NodeID node_id) const 73 { 74 return annotation_data[nodes[node_id].annotation_id].travel_mode; 75 } 76 IsLeftHandDriving(const NodeID node_id) const77 bool IsLeftHandDriving(const NodeID node_id) const 78 { 79 return annotation_data[nodes[node_id].annotation_id].is_left_hand_driving; 80 } 81 IsSegregated(const NodeID node_id) const82 bool IsSegregated(const NodeID node_id) const { return nodes[node_id].segregated; } 83 GetNameID(const NodeID node_id) const84 NameID GetNameID(const NodeID node_id) const 85 { 86 return annotation_data[nodes[node_id].annotation_id].name_id; 87 } 88 GetClassData(const NodeID node_id) const89 ClassData GetClassData(const NodeID node_id) const 90 { 91 return annotation_data[nodes[node_id].annotation_id].classes; 92 } 93 94 friend void serialization::read<Ownership>(storage::tar::FileReader &reader, 95 const std::string &name, 96 EdgeBasedNodeDataContainerImpl &ebn_data_container); 97 friend void 98 serialization::write<Ownership>(storage::tar::FileWriter &writer, 99 const std::string &name, 100 const EdgeBasedNodeDataContainerImpl &ebn_data_container); 101 102 template <typename = std::enable_if<Ownership == storage::Ownership::Container>> Renumber(const std::vector<std::uint32_t> & permutation)103 void Renumber(const std::vector<std::uint32_t> &permutation) 104 { 105 util::inplacePermutation(nodes.begin(), nodes.end(), permutation); 106 } 107 NumberOfNodes() const108 NodeID NumberOfNodes() const { return nodes.size(); } 109 110 // the number of annotations differs from the number of nodes, since annotations can be shared 111 // between a large set of nodes NumberOfAnnotations() const112 AnnotationID NumberOfAnnotations() const { return annotation_data.size(); } 113 GetNode(const NodeID node_id) const114 EdgeBasedNode const &GetNode(const NodeID node_id) const { return nodes[node_id]; } 115 GetAnnotation(const AnnotationID annotation) const116 NodeBasedEdgeAnnotation const &GetAnnotation(const AnnotationID annotation) const 117 { 118 return annotation_data[annotation]; 119 } 120 121 private: 122 Vector<EdgeBasedNode> nodes; 123 Vector<NodeBasedEdgeAnnotation> annotation_data; 124 }; 125 } // namespace detail 126 127 using EdgeBasedNodeDataExternalContainer = 128 detail::EdgeBasedNodeDataContainerImpl<storage::Ownership::External>; 129 using EdgeBasedNodeDataContainer = 130 detail::EdgeBasedNodeDataContainerImpl<storage::Ownership::Container>; 131 using EdgeBasedNodeDataView = detail::EdgeBasedNodeDataContainerImpl<storage::Ownership::View>; 132 } // namespace extractor 133 } // namespace osrm 134 135 #endif 136