Use ranges in datafacade instead of vectors
Range type must use immutable references due to a regression in `boost::any_range`. References: https://svn.boost.org/trac10/ticket/10493 https://stackoverflow.com/questions/42427395/boostany-range-with-optimization-level-o2-causes-crash/42427662
This commit is contained in:
committed by
Patrick Niklaus
parent
282415bbc1
commit
be123cd72f
@@ -239,72 +239,57 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
|
||||
return m_osmnodeid_list[id];
|
||||
}
|
||||
|
||||
std::vector<NodeID> GetUncompressedForwardGeometry(const EdgeID id) const override final
|
||||
NodesIDRangeT GetUncompressedForwardGeometry(const EdgeID id) const override final
|
||||
{
|
||||
|
||||
auto range = segment_data.GetForwardGeometry(id);
|
||||
return std::vector<NodeID>{range.begin(), range.end()};
|
||||
return segment_data.GetForwardGeometry(id);
|
||||
}
|
||||
|
||||
virtual std::vector<NodeID> GetUncompressedReverseGeometry(const EdgeID id) const override final
|
||||
NodesIDRangeT GetUncompressedReverseGeometry(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetReverseGeometry(id);
|
||||
return std::vector<NodeID>{range.begin(), range.end()};
|
||||
return segment_data.GetReverseGeometry(id);
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedForwardDurations(const EdgeID id) const override final
|
||||
DurationsRangeT GetUncompressedForwardDurations(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetForwardDurations(id);
|
||||
return std::vector<EdgeWeight>{range.begin(), range.end()};
|
||||
return segment_data.GetForwardDurations(id);
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedReverseDurations(const EdgeID id) const override final
|
||||
DurationsRangeT GetUncompressedReverseDurations(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetReverseDurations(id);
|
||||
return std::vector<EdgeWeight>{range.begin(), range.end()};
|
||||
return segment_data.GetReverseDurations(id);
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedForwardWeights(const EdgeID id) const override final
|
||||
WeightsRangeT GetUncompressedForwardWeights(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetForwardWeights(id);
|
||||
return std::vector<EdgeWeight>{range.begin(), range.end()};
|
||||
return segment_data.GetForwardWeights(id);
|
||||
}
|
||||
|
||||
virtual std::vector<EdgeWeight>
|
||||
GetUncompressedReverseWeights(const EdgeID id) const override final
|
||||
WeightsRangeT GetUncompressedReverseWeights(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetReverseWeights(id);
|
||||
return std::vector<EdgeWeight>{range.begin(), range.end()};
|
||||
return segment_data.GetReverseWeights(id);
|
||||
}
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights.
|
||||
virtual std::vector<DatasourceID>
|
||||
GetUncompressedForwardDatasources(const EdgeID id) const override final
|
||||
DatasourceIDRangeT GetUncompressedForwardDatasources(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetForwardDatasources(id);
|
||||
return std::vector<DatasourceID>{range.begin(), range.end()};
|
||||
return segment_data.GetForwardDatasources(id);
|
||||
}
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights.
|
||||
virtual std::vector<DatasourceID>
|
||||
GetUncompressedReverseDatasources(const EdgeID id) const override final
|
||||
DatasourceIDRangeT GetUncompressedReverseDatasources(const EdgeID id) const override final
|
||||
{
|
||||
auto range = segment_data.GetReverseDatasources(id);
|
||||
return std::vector<DatasourceID>{range.begin(), range.end()};
|
||||
return segment_data.GetReverseDatasources(id);
|
||||
}
|
||||
|
||||
virtual TurnPenalty GetWeightPenaltyForEdgeID(const unsigned id) const override final
|
||||
TurnPenalty GetWeightPenaltyForEdgeID(const unsigned id) const override final
|
||||
{
|
||||
BOOST_ASSERT(m_turn_weight_penalties.size() > id);
|
||||
return m_turn_weight_penalties[id];
|
||||
}
|
||||
|
||||
virtual TurnPenalty GetDurationPenaltyForEdgeID(const unsigned id) const override final
|
||||
TurnPenalty GetDurationPenaltyForEdgeID(const unsigned id) const override final
|
||||
{
|
||||
BOOST_ASSERT(m_turn_duration_penalties.size() > id);
|
||||
return m_turn_duration_penalties[id];
|
||||
|
||||
@@ -10,9 +10,7 @@
|
||||
|
||||
#include "extractor/class_data.hpp"
|
||||
#include "extractor/edge_based_node_segment.hpp"
|
||||
//#include "extractor/guidance/turn_lane_types.hpp"
|
||||
#include "extractor/maneuver_override.hpp"
|
||||
//#include "extractor/original_edge_data.hpp"
|
||||
#include "extractor/query_node.hpp"
|
||||
#include "extractor/travel_mode.hpp"
|
||||
#include "extractor/turn_lane_types.hpp"
|
||||
@@ -31,6 +29,8 @@
|
||||
|
||||
#include "osrm/coordinate.hpp"
|
||||
|
||||
#include <boost/range/any_range.hpp>
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
#include <string>
|
||||
@@ -50,6 +50,14 @@ class BaseDataFacade
|
||||
{
|
||||
public:
|
||||
using RTreeLeaf = extractor::EdgeBasedNodeSegment;
|
||||
|
||||
template <typename T>
|
||||
using RangeT = boost::any_range<T, boost::random_access_traversal_tag, const T, std::ptrdiff_t>;
|
||||
using NodesIDRangeT = RangeT<NodeID>;
|
||||
using WeightsRangeT = RangeT<SegmentWeight>;
|
||||
using DurationsRangeT = RangeT<SegmentDuration>;
|
||||
using DatasourceIDRangeT = RangeT<DatasourceID>;
|
||||
|
||||
BaseDataFacade() {}
|
||||
virtual ~BaseDataFacade() {}
|
||||
|
||||
@@ -64,9 +72,8 @@ class BaseDataFacade
|
||||
|
||||
virtual ComponentID GetComponentID(const NodeID id) const = 0;
|
||||
|
||||
virtual std::vector<NodeID> GetUncompressedForwardGeometry(const EdgeID id) const = 0;
|
||||
|
||||
virtual std::vector<NodeID> GetUncompressedReverseGeometry(const EdgeID id) const = 0;
|
||||
virtual NodesIDRangeT GetUncompressedForwardGeometry(const EdgeID id) const = 0;
|
||||
virtual NodesIDRangeT GetUncompressedReverseGeometry(const EdgeID id) const = 0;
|
||||
|
||||
virtual TurnPenalty GetWeightPenaltyForEdgeID(const unsigned id) const = 0;
|
||||
|
||||
@@ -74,18 +81,18 @@ class BaseDataFacade
|
||||
|
||||
// Gets the weight values for each segment in an uncompressed geometry.
|
||||
// Should always be 1 shorter than GetUncompressedGeometry
|
||||
virtual std::vector<EdgeWeight> GetUncompressedForwardWeights(const EdgeID id) const = 0;
|
||||
virtual std::vector<EdgeWeight> GetUncompressedReverseWeights(const EdgeID id) const = 0;
|
||||
virtual WeightsRangeT GetUncompressedForwardWeights(const EdgeID id) const = 0;
|
||||
virtual WeightsRangeT GetUncompressedReverseWeights(const EdgeID id) const = 0;
|
||||
|
||||
// Gets the duration values for each segment in an uncompressed geometry.
|
||||
// Should always be 1 shorter than GetUncompressedGeometry
|
||||
virtual std::vector<EdgeWeight> GetUncompressedForwardDurations(const EdgeID id) const = 0;
|
||||
virtual std::vector<EdgeWeight> GetUncompressedReverseDurations(const EdgeID id) const = 0;
|
||||
virtual DurationsRangeT GetUncompressedForwardDurations(const EdgeID id) const = 0;
|
||||
virtual DurationsRangeT GetUncompressedReverseDurations(const EdgeID id) const = 0;
|
||||
|
||||
// Returns the data source ids that were used to supply the edge
|
||||
// weights. Will return an empty array when only the base profile is used.
|
||||
virtual std::vector<DatasourceID> GetUncompressedForwardDatasources(const EdgeID id) const = 0;
|
||||
virtual std::vector<DatasourceID> GetUncompressedReverseDatasources(const EdgeID id) const = 0;
|
||||
virtual DatasourceIDRangeT GetUncompressedForwardDatasources(const EdgeID id) const = 0;
|
||||
virtual DatasourceIDRangeT GetUncompressedReverseDatasources(const EdgeID id) const = 0;
|
||||
|
||||
// Gets the name of a datasource
|
||||
virtual StringView GetDatasourceName(const DatasourceID id) const = 0;
|
||||
|
||||
Reference in New Issue
Block a user