osrm-backend/include/extractor/internal_extractor_edge.hpp

159 lines
4.5 KiB
C++
Raw Normal View History

#ifndef INTERNAL_EXTRACTOR_EDGE_HPP
#define INTERNAL_EXTRACTOR_EDGE_HPP
2016-01-02 11:13:44 -05:00
#include "util/typedefs.hpp"
#include "extractor/travel_mode.hpp"
#include "extractor/node_based_edge.hpp"
#include <boost/assert.hpp>
2016-01-02 11:13:44 -05:00
#include "osrm/coordinate.hpp"
#include <utility>
2014-11-24 11:57:01 -05:00
2016-01-05 10:51:13 -05:00
namespace osrm
{
namespace extractor
{
2014-05-09 10:17:31 -04:00
struct InternalExtractorEdge
{
// specify the type of the weight data
2016-01-05 06:04:04 -05:00
enum class WeightType : char
{
INVALID,
SPEED,
EDGE_DURATION,
WAY_DURATION,
};
struct WeightData
{
2016-01-05 06:04:04 -05:00
WeightData() : duration(0.0), type(WeightType::INVALID) {}
union
{
double duration;
double speed;
};
WeightType type;
};
explicit InternalExtractorEdge()
2016-01-05 06:04:04 -05:00
: result(MIN_OSM_NODEID,
MIN_OSM_NODEID,
0,
0,
false,
false,
false,
false,
true,
TRAVEL_MODE_INACCESSIBLE,
false)
2014-05-09 10:17:31 -04:00
{
}
explicit InternalExtractorEdge(OSMNodeID source,
OSMNodeID target,
NodeID name_id,
WeightData weight_data,
bool forward,
bool backward,
bool roundabout,
bool access_restricted,
bool startpoint,
TravelMode travel_mode,
bool is_split)
: result(OSMNodeID(source),
OSMNodeID(target),
name_id,
0,
forward,
backward,
roundabout,
access_restricted,
startpoint,
travel_mode,
is_split),
weight_data(std::move(weight_data))
{
}
// data that will be written to disk
NodeBasedEdgeWithOSM result;
// intermediate edge weight
WeightData weight_data;
// coordinate of the source node
2016-01-05 10:51:13 -05:00
util::FixedPointCoordinate source_coordinate;
// necessary static util functions for stxxl's sorting
static InternalExtractorEdge min_osm_value()
2014-05-09 10:17:31 -04:00
{
2016-01-05 06:04:04 -05:00
return InternalExtractorEdge(MIN_OSM_NODEID, MIN_OSM_NODEID, 0, WeightData(), false, false,
false, false, true, TRAVEL_MODE_INACCESSIBLE, false);
}
static InternalExtractorEdge max_osm_value()
2014-05-09 10:17:31 -04:00
{
2016-01-05 06:04:04 -05:00
return InternalExtractorEdge(MAX_OSM_NODEID, MAX_OSM_NODEID, 0, WeightData(), false, false,
false, false, true, TRAVEL_MODE_INACCESSIBLE, false);
}
static InternalExtractorEdge min_internal_value()
{
auto v = min_osm_value();
v.result.source = 0;
v.result.target = 0;
return v;
}
static InternalExtractorEdge max_internal_value()
{
auto v = max_osm_value();
v.result.source = std::numeric_limits<NodeID>::max();
v.result.target = std::numeric_limits<NodeID>::max();
return v;
}
};
struct CmpEdgeByInternalStartThenInternalTargetID
{
using value_type = InternalExtractorEdge;
bool operator()(const InternalExtractorEdge &lhs, const InternalExtractorEdge &rhs) const
{
2016-01-05 06:04:04 -05:00
return (lhs.result.source < rhs.result.source) ||
((lhs.result.source == rhs.result.source) &&
(lhs.result.target < rhs.result.target));
}
value_type max_value() { return InternalExtractorEdge::max_internal_value(); }
value_type min_value() { return InternalExtractorEdge::min_internal_value(); }
};
struct CmpEdgeByOSMStartID
2014-05-09 10:17:31 -04:00
{
using value_type = InternalExtractorEdge;
bool operator()(const InternalExtractorEdge &lhs, const InternalExtractorEdge &rhs) const
2014-05-09 10:17:31 -04:00
{
return lhs.result.osm_source_id < rhs.result.osm_source_id;
}
value_type max_value() { return InternalExtractorEdge::max_osm_value(); }
value_type min_value() { return InternalExtractorEdge::min_osm_value(); }
};
struct CmpEdgeByOSMTargetID
2014-05-09 10:17:31 -04:00
{
using value_type = InternalExtractorEdge;
bool operator()(const InternalExtractorEdge &lhs, const InternalExtractorEdge &rhs) const
2014-05-09 10:17:31 -04:00
{
return lhs.result.osm_target_id < rhs.result.osm_target_id;
}
value_type max_value() { return InternalExtractorEdge::max_osm_value(); }
value_type min_value() { return InternalExtractorEdge::min_osm_value(); }
};
2016-01-05 10:51:13 -05:00
}
}
#endif // INTERNAL_EXTRACTOR_EDGE_HPP