/srv/osrm/osrm-backend/include/util
NameSizeModeActions
guidance/-0755rm
alias.hpp68700644editdlrm
assert.hpp19640644editdlrm
attributes.hpp3570644editdlrm
bearing.hpp39640644editdlrm
bit_range.hpp29500644editdlrm
cheap_ruler.hpp21240644editdlrm
concurrent_id_map.hpp21480644editdlrm
conditional_restrictions.hpp6270644editdlrm
connectivity_checksum.hpp19310644editdlrm
coordinate.hpp92440644editdlrm
coordinate_calculation.hpp162970644editdlrm
deallocating_vector.hpp112050644editdlrm
debug.hpp59580644editdlrm
dist_table_wrapper.hpp22990644editdlrm
dynamic_graph.hpp159510644editdlrm
exception.hpp51260644editdlrm
exception_utils.hpp6090644editdlrm
exclude_flag.hpp9750644editdlrm
filtered_graph.hpp54020644editdlrm
filtered_integer_range.hpp30970644editdlrm
fingerprint.hpp11660644editdlrm
for_each_indexed.hpp6340644editdlrm
for_each_pair.hpp9900644editdlrm
for_each_range.hpp4770644editdlrm
geojson_debug_logger.hpp63300644editdlrm
geojson_debug_policies.hpp18100644editdlrm
geojson_debug_policy_toolkit.hpp32580644editdlrm
geojson_validation.hpp28990644editdlrm
graph_traits.hpp12450644editdlrm
graph_utils.hpp31410644editdlrm
group_by.hpp7220644editdlrm
hilbert_value.hpp30100644editdlrm
indexed_data.hpp150390644editdlrm
integer_range.hpp32860644editdlrm
isatty.hpp6100644editdlrm
json_container.hpp31810644editdlrm
json_deep_compare.hpp47320644editdlrm
json_renderer.hpp41600644editdlrm
json_util.hpp5440644editdlrm
log.hpp21870644editdlrm
lua_util.hpp8910644editdlrm
matrix_graph_wrapper.hpp12940644editdlrm
meminfo.hpp6600644editdlrm
mmap_file.hpp27760644editdlrm
mmap_tar.hpp10070644editdlrm
msb.hpp11780644editdlrm
node_based_graph.hpp35300644editdlrm
opening_hours.hpp83380644editdlrm
packed_vector.hpp216910644editdlrm
percent.hpp21060644editdlrm
permutation.hpp19910644editdlrm
query_heap.hpp102050644editdlrm
range_table.hpp71190644editdlrm
rectangle.hpp59000644editdlrm
serialization.hpp59020644editdlrm
static_assert.hpp6400644editdlrm
static_graph.hpp107020644editdlrm
static_rtree.hpp341470644editdlrm
std_hash.hpp10350644editdlrm
string_util.hpp34000644editdlrm
tarjan_scc.hpp66460644editdlrm
timed_histogram.hpp25760644editdlrm
timezones.hpp14170644editdlrm
timing_util.hpp14850644editdlrm
to_osm_link.hpp6940644editdlrm
trigonometry_table.hpp359060644editdlrm
typedefs.hpp76270644editdlrm
vector_tile.hpp3030644editdlrm
vector_view.hpp80000644editdlrm
version.hpp.in4060644editdlrm
viewport.hpp15790644editdlrm
web_mercator.hpp64800644editdlrm
xor_fast_hash.hpp17970644editdlrm
xor_fast_hash_storage.hpp21950644editdlrm
Edit: /srv/osrm/osrm-backend/include/util/static_graph.hpp (10702B)
#ifndef STATIC_GRAPH_HPP #define STATIC_GRAPH_HPP #include "util/graph_traits.hpp" #include "util/integer_range.hpp" #include "util/percent.hpp" #include "util/permutation.hpp" #include "util/typedefs.hpp" #include "util/vector_view.hpp" #include "storage/shared_memory_ownership.hpp" #include "storage/tar_fwd.hpp" #include #include #include #include #include #include namespace osrm::util { template class StaticGraph; namespace serialization { template void read(storage::tar::FileReader &reader, const std::string &name, StaticGraph &graph); template void write(storage::tar::FileWriter &writer, const std::string &name, const StaticGraph &graph); } // namespace serialization namespace static_graph_details { using NodeIterator = NodeID; using EdgeIterator = NodeID; struct NodeArrayEntry { // index of the first edge EdgeIterator first_edge; }; template struct EdgeArrayEntry; template struct EdgeArrayEntry { NodeID target; EdgeDataT data; }; template <> struct EdgeArrayEntry { NodeID target; }; template struct SortableEdgeWithData; template <> struct SortableEdgeWithData { NodeIterator source; NodeIterator target; SortableEdgeWithData() = default; SortableEdgeWithData(NodeIterator source, NodeIterator target) : source(source), target(target) { } bool operator<(const SortableEdgeWithData &right) const { return std::tie(source, target) < std::tie(right.source, right.target); } bool operator==(const SortableEdgeWithData &right) const { return std::tie(source, target) == std::tie(right.source, right.target); } }; template struct SortableEdgeWithData : SortableEdgeWithData { using Base = SortableEdgeWithData; EdgeDataT data; SortableEdgeWithData() = default; template SortableEdgeWithData(NodeIterator source, NodeIterator target, Ts &&... data) : Base{source, target}, data{std::forward(data)...} { } }; template EntryT edgeToEntry(const OtherEdge &from, std::true_type) { return EntryT{from.target, from.data}; } template EntryT edgeToEntry(const OtherEdge &from, std::false_type) { return EntryT{from.target}; } } // namespace static_graph_details template class StaticGraph { template using Vector = util::ViewOrVector; public: using InputEdge = static_graph_details::SortableEdgeWithData; using NodeIterator = static_graph_details::NodeIterator; using EdgeIterator = static_graph_details::EdgeIterator; using EdgeRange = range; using NodeArrayEntry = static_graph_details::NodeArrayEntry; using EdgeArrayEntry = static_graph_details::EdgeArrayEntry; EdgeRange GetAdjacentEdgeRange(const NodeID node) const { return irange(BeginEdges(node), EndEdges(node)); } StaticGraph() {} template StaticGraph(const std::uint32_t nodes, const ContainerT &edges) { BOOST_ASSERT(std::is_sorted(const_cast(edges).begin(), const_cast(edges).end())); InitializeFromSortedEdgeRange(nodes, edges.begin(), edges.end()); } StaticGraph(Vector node_array_, Vector edge_array_) : node_array(std::move(node_array_)), edge_array(std::move(edge_array_)) { BOOST_ASSERT(!node_array.empty()); number_of_nodes = static_cast(node_array.size() - 1); number_of_edges = static_cast(node_array.back().first_edge); BOOST_ASSERT(number_of_edges <= edge_array.size()); BOOST_ASSERT(number_of_nodes == node_array.size() - 1); } unsigned GetNumberOfNodes() const { return number_of_nodes; } unsigned GetNumberOfEdges() const { return number_of_edges; } unsigned GetOutDegree(const NodeIterator n) const { return EndEdges(n) - BeginEdges(n); } inline NodeIterator GetTarget(const EdgeIterator e) const { return NodeIterator(edge_array[e].target); } auto &GetEdgeData(const EdgeIterator e) { return edge_array[e].data; } const auto &GetEdgeData(const EdgeIterator e) const { return edge_array[e].data; } EdgeIterator BeginEdges(const NodeIterator n) const { return EdgeIterator(node_array.at(n).first_edge); } EdgeIterator EndEdges(const NodeIterator n) const { return EdgeIterator(node_array.at(n + 1).first_edge); } // searches for a specific edge EdgeIterator FindEdge(const NodeIterator from, const NodeIterator to) const { for (const auto i : irange(BeginEdges(from), EndEdges(from))) { if (to == edge_array[i].target) { return i; } } return SPECIAL_EDGEID; } /** * Finds the edge with the smallest `.weight` going from `from` to `to` * @param from the source node ID * @param to the target node ID * @param filter a functor that returns a `bool` that determines whether an edge should be * tested or not. * Takes `EdgeData` as a parameter. * @return the ID of the smallest edge if any were found that satisfied *filter*, or * `SPECIAL_EDGEID` if no * matching edge is found. */ template EdgeIterator FindSmallestEdge(const NodeIterator from, const NodeIterator to, FilterFunction &&filter) const { static_assert(traits::HasDataMember::value, "Filtering on .data not possible without .data member attribute"); EdgeIterator smallest_edge = SPECIAL_EDGEID; EdgeWeight smallest_weight = INVALID_EDGE_WEIGHT; for (auto edge : GetAdjacentEdgeRange(from)) { const NodeID target = GetTarget(edge); const auto &data = GetEdgeData(edge); if (target == to && data.weight < smallest_weight && std::forward(filter)(data)) { smallest_edge = edge; smallest_weight = data.weight; } } return smallest_edge; } EdgeIterator FindEdgeInEitherDirection(const NodeIterator from, const NodeIterator to) const { EdgeIterator tmp = FindEdge(from, to); return (SPECIAL_NODEID != tmp ? tmp : FindEdge(to, from)); } EdgeIterator FindEdgeIndicateIfReverse(const NodeIterator from, const NodeIterator to, bool &result) const { EdgeIterator current_iterator = FindEdge(from, to); if (SPECIAL_NODEID == current_iterator) { current_iterator = FindEdge(to, from); if (SPECIAL_NODEID != current_iterator) { result = true; } } return current_iterator; } void Renumber(const std::vector &old_to_new_node) { std::vector new_to_old_node(number_of_nodes); for (auto node : util::irange(0, number_of_nodes)) new_to_old_node[old_to_new_node[node]] = node; Vector new_node_array(node_array.size()); // Build up edge permutation auto new_edge_index = 0; std::vector old_to_new_edge(edge_array.size(), SPECIAL_EDGEID); for (auto node : util::irange(0, number_of_nodes)) { auto new_first_edge = new_edge_index; for (auto edge : GetAdjacentEdgeRange(new_to_old_node[node])) { edge_array[edge].target = old_to_new_node[edge_array[edge].target]; old_to_new_edge[edge] = new_edge_index++; } new_node_array[node].first_edge = new_first_edge; } new_node_array.back().first_edge = new_edge_index; node_array = std::move(new_node_array); BOOST_ASSERT(std::find(old_to_new_edge.begin(), old_to_new_edge.end(), SPECIAL_EDGEID) == old_to_new_edge.end()); util::inplacePermutation(edge_array.begin(), edge_array.end(), old_to_new_edge); } friend void serialization::read(storage::tar::FileReader &reader, const std::string &name, StaticGraph &graph); friend void serialization::write(storage::tar::FileWriter &writer, const std::string &name, const StaticGraph &graph); protected: template void InitializeFromSortedEdgeRange(const std::uint32_t nodes, IterT begin, IterT end) { number_of_nodes = nodes; number_of_edges = static_cast(std::distance(begin, end)); node_array.reserve(number_of_nodes + 1); node_array.push_back(NodeArrayEntry{0u}); auto iter = begin; for (auto node : util::irange(0u, nodes)) { iter = std::find_if(iter, end, [node](const auto &edge) { return edge.source != node; }); unsigned offset = std::distance(begin, iter); node_array.push_back(NodeArrayEntry{offset}); } BOOST_ASSERT_MSG( iter == end, ("Still " + std::to_string(std::distance(iter, end)) + " edges left.").c_str()); BOOST_ASSERT(node_array.size() == number_of_nodes + 1); edge_array.resize(number_of_edges); std::transform(begin, end, edge_array.begin(), [](const auto &from) { return static_graph_details::edgeToEntry( from, traits::HasDataMember{}); }); } protected: NodeIterator number_of_nodes = 0; EdgeIterator number_of_edges = 0; Vector node_array; Vector edge_array; }; } // namespace osrm::util #endif // STATIC_GRAPH_HPP