forked from Project-OSRM/osrm-backend
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathengine.hpp
144 lines (126 loc) · 5.43 KB
/
engine.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#ifndef ENGINE_HPP
#define ENGINE_HPP
#include "engine/api/match_parameters.hpp"
#include "engine/api/nearest_parameters.hpp"
#include "engine/api/route_parameters.hpp"
#include "engine/api/table_parameters.hpp"
#include "engine/api/tile_parameters.hpp"
#include "engine/api/trip_parameters.hpp"
#include "engine/datafacade_provider.hpp"
#include "engine/engine_config.hpp"
#include "engine/plugins/match.hpp"
#include "engine/plugins/nearest.hpp"
#include "engine/plugins/table.hpp"
#include "engine/plugins/tile.hpp"
#include "engine/plugins/trip.hpp"
#include "engine/plugins/viaroute.hpp"
#include "engine/routing_algorithms.hpp"
#include "engine/status.hpp"
#include "util/json_container.hpp"
#include <memory>
#include <string>
namespace osrm
{
namespace engine
{
class EngineInterface
{
public:
virtual ~EngineInterface() = default;
virtual Status Route(const api::RouteParameters ¶meters,
util::json::Object &result) const = 0;
virtual Status Table(const api::TableParameters ¶meters,
util::json::Object &result) const = 0;
virtual Status Nearest(const api::NearestParameters ¶meters,
util::json::Object &result) const = 0;
virtual Status Trip(const api::TripParameters ¶meters,
util::json::Object &result) const = 0;
virtual Status Match(const api::MatchParameters ¶meters,
util::json::Object &result) const = 0;
virtual Status Tile(const api::TileParameters ¶meters, std::string &result) const = 0;
};
template <typename Algorithm> class Engine final : public EngineInterface
{
public:
explicit Engine(const EngineConfig &config)
: route_plugin(config.max_locations_viaroute, config.max_alternatives), //
table_plugin(config.max_locations_distance_table), //
nearest_plugin(config.max_results_nearest), //
trip_plugin(config.max_locations_trip), //
match_plugin(config.max_locations_map_matching, config.max_radius_map_matching), //
tile_plugin() //
{
if (config.use_shared_memory)
{
util::Log(logDEBUG) << "Using shared memory with name \"" << config.dataset_name
<< "\" with algorithm " << routing_algorithms::name<Algorithm>();
facade_provider = std::make_unique<WatchingProvider<Algorithm>>(config.dataset_name);
}
else if (!config.memory_file.empty() || config.use_mmap)
{
if (!config.memory_file.empty())
{
util::Log(logWARNING)
<< "The 'memory_file' option is DEPRECATED - using direct mmaping instead";
}
util::Log(logDEBUG) << "Using direct memory mapping with algorithm "
<< routing_algorithms::name<Algorithm>();
facade_provider = std::make_unique<ExternalProvider<Algorithm>>(config.storage_config);
}
else
{
util::Log(logDEBUG) << "Using internal memory with algorithm "
<< routing_algorithms::name<Algorithm>();
facade_provider = std::make_unique<ImmutableProvider<Algorithm>>(config.storage_config);
}
}
Engine(Engine &&) noexcept = delete;
Engine &operator=(Engine &&) noexcept = delete;
Engine(const Engine &) = delete;
Engine &operator=(const Engine &) = delete;
virtual ~Engine() = default;
Status Route(const api::RouteParameters ¶ms,
util::json::Object &result) const override final
{
return route_plugin.HandleRequest(GetAlgorithms(params), params, result);
}
Status Table(const api::TableParameters ¶ms,
util::json::Object &result) const override final
{
return table_plugin.HandleRequest(GetAlgorithms(params), params, result);
}
Status Nearest(const api::NearestParameters ¶ms,
util::json::Object &result) const override final
{
return nearest_plugin.HandleRequest(GetAlgorithms(params), params, result);
}
Status Trip(const api::TripParameters ¶ms, util::json::Object &result) const override final
{
return trip_plugin.HandleRequest(GetAlgorithms(params), params, result);
}
Status Match(const api::MatchParameters ¶ms,
util::json::Object &result) const override final
{
return match_plugin.HandleRequest(GetAlgorithms(params), params, result);
}
Status Tile(const api::TileParameters ¶ms, std::string &result) const override final
{
return tile_plugin.HandleRequest(GetAlgorithms(params), params, result);
}
private:
template <typename ParametersT> auto GetAlgorithms(const ParametersT ¶ms) const
{
return RoutingAlgorithms<Algorithm>{heaps, facade_provider->Get(params)};
}
std::unique_ptr<DataFacadeProvider<Algorithm>> facade_provider;
mutable SearchEngineData<Algorithm> heaps;
const plugins::ViaRoutePlugin route_plugin;
const plugins::TablePlugin table_plugin;
const plugins::NearestPlugin nearest_plugin;
const plugins::TripPlugin trip_plugin;
const plugins::MatchPlugin match_plugin;
const plugins::TilePlugin tile_plugin;
};
}
}
#endif // OSRM_IMPL_HPP