| 130 | } |
| 131 | |
| 132 | void ObstacleMap::fixupNodes(const NodeIDVector &node_ids) |
| 133 | { |
| 134 | util::UnbufferedLog log; |
| 135 | log << "Renumbering " << osm_obstacles.size() << " obstacles..."; |
| 136 | TIMER_START(obstacle_renumbering); |
| 137 | |
| 138 | const auto should_skip = [](const auto &osm_from, const auto &, const auto &obstacle) |
| 139 | { |
| 140 | return (obstacle.direction == Obstacle::Direction::Forward || |
| 141 | obstacle.direction == Obstacle::Direction::Backward) && |
| 142 | osm_from == SPECIAL_OSM_NODEID; |
| 143 | }; |
| 144 | |
| 145 | std::vector<OSMNodeID> used_osm_node_ids; |
| 146 | used_osm_node_ids.reserve(osm_obstacles.size() * 2); |
| 147 | |
| 148 | for (const auto &[osm_from, osm_to, obstacle] : osm_obstacles) |
| 149 | { |
| 150 | if (should_skip(osm_from, osm_to, obstacle)) |
| 151 | continue; |
| 152 | |
| 153 | if (osm_from != SPECIAL_OSM_NODEID) |
| 154 | used_osm_node_ids.push_back(osm_from); |
| 155 | |
| 156 | if (osm_to != SPECIAL_OSM_NODEID) |
| 157 | used_osm_node_ids.push_back(osm_to); |
| 158 | } |
| 159 | |
| 160 | std::sort(used_osm_node_ids.begin(), used_osm_node_ids.end()); |
| 161 | used_osm_node_ids.erase(std::unique(used_osm_node_ids.begin(), used_osm_node_ids.end()), |
| 162 | used_osm_node_ids.end()); |
| 163 | |
| 164 | std::vector<NodeID> internal_node_ids(used_osm_node_ids.size(), SPECIAL_NODEID); |
| 165 | |
| 166 | std::size_t node_index = 0; |
| 167 | std::size_t used_index = 0; |
| 168 | |
| 169 | while (node_index < node_ids.size() && used_index < used_osm_node_ids.size()) |
| 170 | { |
| 171 | const auto node_id = node_ids[node_index]; |
| 172 | const auto used_id = used_osm_node_ids[used_index]; |
| 173 | |
| 174 | if (node_id < used_id) |
| 175 | { |
| 176 | ++node_index; |
| 177 | } |
| 178 | else if (used_id < node_id) |
| 179 | { |
| 180 | ++used_index; |
| 181 | } |
| 182 | else |
| 183 | { |
| 184 | internal_node_ids[used_index] = static_cast<NodeID>(node_index); |
| 185 | ++used_index; |
| 186 | } |
| 187 | } |
| 188 | |
| 189 | auto osm_to_internal = [&](const OSMNodeID osm_node) -> NodeID |