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