Use Boost.Optional instead of custom optional monad implementation.
This switches out the `<variant/optional.hpp>` implementation of the optional monad to the one from Boost. The following trick makes sure we keep compile times down: - use `<boost/optional/optional_fwd.hpp>` to forward declare the optional type in header, then include the full blown optional header only in the implementation file. - do the same for the files we touch, e.g. forward declare osmium types, allowing us to remove the osmium header dependency from our headers: `namespace osmium { class Relation; } and then include the appropriate osmium headers in the implementation file only. We should do this globally... References: - http://www.boost.org/doc/libs/1_59_0/libs/optional/doc/html/index.html - https://github.com/osmcode/libosmium/issues/123
This commit is contained in:
parent
be506f7121
commit
82dd5d8ccf
@ -45,6 +45,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/filesystem/fstream.hpp>
|
#include <boost/filesystem/fstream.hpp>
|
||||||
|
#include <boost/optional/optional.hpp>
|
||||||
|
|
||||||
#include <luabind/luabind.hpp>
|
#include <luabind/luabind.hpp>
|
||||||
|
|
||||||
@ -53,8 +54,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <tbb/parallel_for.h>
|
#include <tbb/parallel_for.h>
|
||||||
#include <tbb/task_scheduler_init.h>
|
#include <tbb/task_scheduler_init.h>
|
||||||
|
|
||||||
#include <variant/optional.hpp>
|
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -151,8 +150,7 @@ int extractor::run()
|
|||||||
// initialize vectors holding parsed objects
|
// initialize vectors holding parsed objects
|
||||||
tbb::concurrent_vector<std::pair<std::size_t, ExtractionNode>> resulting_nodes;
|
tbb::concurrent_vector<std::pair<std::size_t, ExtractionNode>> resulting_nodes;
|
||||||
tbb::concurrent_vector<std::pair<std::size_t, ExtractionWay>> resulting_ways;
|
tbb::concurrent_vector<std::pair<std::size_t, ExtractionWay>> resulting_ways;
|
||||||
tbb::concurrent_vector<mapbox::util::optional<InputRestrictionContainer>>
|
tbb::concurrent_vector<boost::optional<InputRestrictionContainer>> resulting_restrictions;
|
||||||
resulting_restrictions;
|
|
||||||
|
|
||||||
// setup restriction parser
|
// setup restriction parser
|
||||||
const RestrictionParser restriction_parser(scripting_environment.get_lua_state());
|
const RestrictionParser restriction_parser(scripting_environment.get_lua_state());
|
||||||
|
@ -35,6 +35,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "../util/container.hpp"
|
#include "../util/container.hpp"
|
||||||
#include "../util/simple_logger.hpp"
|
#include "../util/simple_logger.hpp"
|
||||||
|
|
||||||
|
#include <boost/optional/optional.hpp>
|
||||||
|
|
||||||
|
#include <osmium/osm.hpp>
|
||||||
|
|
||||||
#include <osrm/coordinate.hpp>
|
#include <osrm/coordinate.hpp>
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
@ -65,7 +69,7 @@ void ExtractorCallbacks::ProcessNode(const osmium::Node &input_node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ExtractorCallbacks::ProcessRestriction(
|
void ExtractorCallbacks::ProcessRestriction(
|
||||||
const mapbox::util::optional<InputRestrictionContainer> &restriction)
|
const boost::optional<InputRestrictionContainer> &restriction)
|
||||||
{
|
{
|
||||||
if (restriction)
|
if (restriction)
|
||||||
{
|
{
|
||||||
@ -140,8 +144,8 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (forward_weight_data.type == InternalExtractorEdge::WeightType::INVALID
|
if (forward_weight_data.type == InternalExtractorEdge::WeightType::INVALID &&
|
||||||
&& backward_weight_data.type == InternalExtractorEdge::WeightType::INVALID)
|
backward_weight_data.type == InternalExtractorEdge::WeightType::INVALID)
|
||||||
{
|
{
|
||||||
SimpleLogger().Write(logDEBUG) << "found way with bogus speed, id: " << input_way.id();
|
SimpleLogger().Write(logDEBUG) << "found way with bogus speed, id: " << input_way.id();
|
||||||
return;
|
return;
|
||||||
@ -169,7 +173,10 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
|
|||||||
|
|
||||||
std::transform(input_way.nodes().begin(), input_way.nodes().end(),
|
std::transform(input_way.nodes().begin(), input_way.nodes().end(),
|
||||||
std::back_inserter(external_memory.used_node_id_list),
|
std::back_inserter(external_memory.used_node_id_list),
|
||||||
[](const osmium::NodeRef& ref) { return ref.ref(); });
|
[](const osmium::NodeRef &ref)
|
||||||
|
{
|
||||||
|
return ref.ref();
|
||||||
|
});
|
||||||
|
|
||||||
const bool is_opposite_way = TRAVEL_MODE_INACCESSIBLE == parsed_way.forward_travel_mode;
|
const bool is_opposite_way = TRAVEL_MODE_INACCESSIBLE == parsed_way.forward_travel_mode;
|
||||||
|
|
||||||
@ -182,53 +189,51 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
|
|||||||
[&](const osmium::NodeRef &first_node, const osmium::NodeRef &last_node)
|
[&](const osmium::NodeRef &first_node, const osmium::NodeRef &last_node)
|
||||||
{
|
{
|
||||||
external_memory.all_edges_list.push_back(InternalExtractorEdge(
|
external_memory.all_edges_list.push_back(InternalExtractorEdge(
|
||||||
first_node.ref(), last_node.ref(), name_id, backward_weight_data,
|
first_node.ref(), last_node.ref(), name_id,
|
||||||
true, false, parsed_way.roundabout, parsed_way.is_access_restricted,
|
backward_weight_data, true, false, parsed_way.roundabout,
|
||||||
|
parsed_way.is_access_restricted,
|
||||||
parsed_way.backward_travel_mode, false));
|
parsed_way.backward_travel_mode, false));
|
||||||
});
|
});
|
||||||
|
|
||||||
external_memory.way_start_end_id_list.push_back(
|
external_memory.way_start_end_id_list.push_back(
|
||||||
{
|
{static_cast<EdgeID>(input_way.id()),
|
||||||
static_cast<EdgeID>(input_way.id()),
|
static_cast<NodeID>(input_way.nodes().back().ref()),
|
||||||
static_cast<NodeID>(input_way.nodes().back().ref()),
|
static_cast<NodeID>(input_way.nodes()[input_way.nodes().size() - 2].ref()),
|
||||||
static_cast<NodeID>(input_way.nodes()[input_way.nodes().size() - 2].ref()),
|
static_cast<NodeID>(input_way.nodes()[1].ref()),
|
||||||
static_cast<NodeID>(input_way.nodes()[1].ref()),
|
static_cast<NodeID>(input_way.nodes()[0].ref())});
|
||||||
static_cast<NodeID>(input_way.nodes()[0].ref())
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const bool forward_only = split_edge || TRAVEL_MODE_INACCESSIBLE == parsed_way.backward_travel_mode;
|
const bool forward_only =
|
||||||
|
split_edge || TRAVEL_MODE_INACCESSIBLE == parsed_way.backward_travel_mode;
|
||||||
osrm::for_each_pair(input_way.nodes().cbegin(), input_way.nodes().cend(),
|
osrm::for_each_pair(input_way.nodes().cbegin(), input_way.nodes().cend(),
|
||||||
[&](const osmium::NodeRef &first_node, const osmium::NodeRef &last_node)
|
[&](const osmium::NodeRef &first_node, const osmium::NodeRef &last_node)
|
||||||
{
|
{
|
||||||
external_memory.all_edges_list.push_back(InternalExtractorEdge(
|
external_memory.all_edges_list.push_back(InternalExtractorEdge(
|
||||||
first_node.ref(), last_node.ref(), name_id, forward_weight_data,
|
first_node.ref(), last_node.ref(), name_id, forward_weight_data,
|
||||||
true, !forward_only, parsed_way.roundabout, parsed_way.is_access_restricted,
|
true, !forward_only, parsed_way.roundabout,
|
||||||
parsed_way.forward_travel_mode, split_edge));
|
parsed_way.is_access_restricted, parsed_way.forward_travel_mode,
|
||||||
|
split_edge));
|
||||||
});
|
});
|
||||||
if (split_edge)
|
if (split_edge)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(parsed_way.backward_travel_mode != TRAVEL_MODE_INACCESSIBLE);
|
BOOST_ASSERT(parsed_way.backward_travel_mode != TRAVEL_MODE_INACCESSIBLE);
|
||||||
osrm::for_each_pair(input_way.nodes().cbegin(), input_way.nodes().cend(),
|
osrm::for_each_pair(
|
||||||
[&](const osmium::NodeRef &first_node, const osmium::NodeRef &last_node)
|
input_way.nodes().cbegin(), input_way.nodes().cend(),
|
||||||
{
|
[&](const osmium::NodeRef &first_node, const osmium::NodeRef &last_node)
|
||||||
external_memory.all_edges_list.push_back(InternalExtractorEdge(
|
{
|
||||||
first_node.ref(), last_node.ref(), name_id, backward_weight_data,
|
external_memory.all_edges_list.push_back(InternalExtractorEdge(
|
||||||
false, true, parsed_way.roundabout, parsed_way.is_access_restricted,
|
first_node.ref(), last_node.ref(), name_id, backward_weight_data, false,
|
||||||
parsed_way.backward_travel_mode, true));
|
true, parsed_way.roundabout, parsed_way.is_access_restricted,
|
||||||
});
|
parsed_way.backward_travel_mode, true));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
external_memory.way_start_end_id_list.push_back(
|
external_memory.way_start_end_id_list.push_back(
|
||||||
{
|
{static_cast<EdgeID>(input_way.id()),
|
||||||
static_cast<EdgeID>(input_way.id()),
|
static_cast<NodeID>(input_way.nodes().back().ref()),
|
||||||
static_cast<NodeID>(input_way.nodes().back().ref()),
|
static_cast<NodeID>(input_way.nodes()[input_way.nodes().size() - 2].ref()),
|
||||||
static_cast<NodeID>(input_way.nodes()[input_way.nodes().size() - 2].ref()),
|
static_cast<NodeID>(input_way.nodes()[1].ref()),
|
||||||
static_cast<NodeID>(input_way.nodes()[1].ref()),
|
static_cast<NodeID>(input_way.nodes()[0].ref())});
|
||||||
static_cast<NodeID>(input_way.nodes()[0].ref())
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef EXTRACTOR_CALLBACKS_HPP
|
#ifndef EXTRACTOR_CALLBACKS_HPP
|
||||||
#define EXTRACTOR_CALLBACKS_HPP
|
#define EXTRACTOR_CALLBACKS_HPP
|
||||||
|
|
||||||
#include "extraction_way.hpp"
|
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
|
#include <boost/optional/optional_fwd.hpp>
|
||||||
#include <osmium/osm.hpp>
|
|
||||||
|
|
||||||
#include <variant/optional.hpp>
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
@ -42,6 +38,12 @@ struct ExternalMemoryNode;
|
|||||||
class ExtractionContainers;
|
class ExtractionContainers;
|
||||||
struct InputRestrictionContainer;
|
struct InputRestrictionContainer;
|
||||||
struct ExtractionNode;
|
struct ExtractionNode;
|
||||||
|
struct ExtractionWay;
|
||||||
|
namespace osmium
|
||||||
|
{
|
||||||
|
class Node;
|
||||||
|
class Way;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is uses by the extractor with the results of the
|
* This class is uses by the extractor with the results of the
|
||||||
@ -66,7 +68,7 @@ class ExtractorCallbacks
|
|||||||
void ProcessNode(const osmium::Node ¤t_node, const ExtractionNode &result_node);
|
void ProcessNode(const osmium::Node ¤t_node, const ExtractionNode &result_node);
|
||||||
|
|
||||||
// warning: caller needs to take care of synchronization!
|
// warning: caller needs to take care of synchronization!
|
||||||
void ProcessRestriction(const mapbox::util::optional<InputRestrictionContainer> &restriction);
|
void ProcessRestriction(const boost::optional<InputRestrictionContainer> &restriction);
|
||||||
|
|
||||||
// warning: caller needs to take care of synchronization!
|
// warning: caller needs to take care of synchronization!
|
||||||
void ProcessWay(const osmium::Way ¤t_way, const ExtractionWay &result_way);
|
void ProcessWay(const osmium::Way ¤t_way, const ExtractionWay &result_way);
|
||||||
|
@ -38,17 +38,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <boost/algorithm/string/predicate.hpp>
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
#include <boost/ref.hpp>
|
#include <boost/ref.hpp>
|
||||||
#include <boost/regex.hpp>
|
#include <boost/regex.hpp>
|
||||||
|
#include <boost/optional/optional.hpp>
|
||||||
|
|
||||||
|
#include <osmium/osm.hpp>
|
||||||
|
#include <osmium/tags/regex_filter.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
int lua_error_callback(lua_State *lua_state)
|
int lua_error_callback(lua_State *lua_state)
|
||||||
{
|
{
|
||||||
std::string error_msg = lua_tostring(lua_state, -1);
|
std::string error_msg = lua_tostring(lua_state, -1);
|
||||||
std::ostringstream error_stream;
|
throw osrm::exception("ERROR occured in profile script:\n" + error_msg);
|
||||||
error_stream << error_msg;
|
|
||||||
throw osrm::exception("ERROR occured in profile script:\n" + error_stream.str());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,18 +107,18 @@ void RestrictionParser::ReadRestrictionExceptions(lua_State *lua_state)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Tries to parse an relation as turn restriction. This can fail for a number of
|
* Tries to parse an relation as turn restriction. This can fail for a number of
|
||||||
* reasons, this the return type is a mapbox::util::optional<>.
|
* reasons, this the return type is a boost::optional<T>.
|
||||||
*
|
*
|
||||||
* Some restrictions can also be ignored: See the ```get_exceptions``` function
|
* Some restrictions can also be ignored: See the ```get_exceptions``` function
|
||||||
* in the corresponding profile.
|
* in the corresponding profile.
|
||||||
*/
|
*/
|
||||||
mapbox::util::optional<InputRestrictionContainer>
|
boost::optional<InputRestrictionContainer>
|
||||||
RestrictionParser::TryParse(const osmium::Relation &relation) const
|
RestrictionParser::TryParse(const osmium::Relation &relation) const
|
||||||
{
|
{
|
||||||
// return if turn restrictions should be ignored
|
// return if turn restrictions should be ignored
|
||||||
if (!use_turn_restrictions)
|
if (!use_turn_restrictions)
|
||||||
{
|
{
|
||||||
return mapbox::util::optional<InputRestrictionContainer>();
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
osmium::tags::KeyPrefixFilter filter(false);
|
osmium::tags::KeyPrefixFilter filter(false);
|
||||||
@ -129,14 +132,14 @@ RestrictionParser::TryParse(const osmium::Relation &relation) const
|
|||||||
// if it's a restriction, continue;
|
// if it's a restriction, continue;
|
||||||
if (std::distance(fi_begin, fi_end) == 0)
|
if (std::distance(fi_begin, fi_end) == 0)
|
||||||
{
|
{
|
||||||
return mapbox::util::optional<InputRestrictionContainer>();
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if the restriction should be ignored
|
// check if the restriction should be ignored
|
||||||
const char *except = relation.get_value_by_key("except");
|
const char *except = relation.get_value_by_key("except");
|
||||||
if (except != nullptr && ShouldIgnoreRestriction(except))
|
if (except != nullptr && ShouldIgnoreRestriction(except))
|
||||||
{
|
{
|
||||||
return mapbox::util::optional<InputRestrictionContainer>();
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_only_restriction = false;
|
bool is_only_restriction = false;
|
||||||
@ -164,7 +167,7 @@ RestrictionParser::TryParse(const osmium::Relation &relation) const
|
|||||||
|
|
||||||
if (!is_actually_restricted)
|
if (!is_actually_restricted)
|
||||||
{
|
{
|
||||||
return mapbox::util::optional<InputRestrictionContainer>();
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -218,7 +221,7 @@ RestrictionParser::TryParse(const osmium::Relation &relation) const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mapbox::util::optional<InputRestrictionContainer>(restriction_container);
|
return boost::make_optional(std::move(restriction_container));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RestrictionParser::ShouldIgnoreRestriction(const std::string &except_tag_string) const
|
bool RestrictionParser::ShouldIgnoreRestriction(const std::string &except_tag_string) const
|
||||||
|
@ -30,16 +30,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "../data_structures/restriction.hpp"
|
#include "../data_structures/restriction.hpp"
|
||||||
|
|
||||||
#include <osmium/osm.hpp>
|
#include <boost/optional/optional_fwd.hpp>
|
||||||
#include <osmium/tags/regex_filter.hpp>
|
|
||||||
|
|
||||||
#include <variant/optional.hpp>
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
class ScriptingEnvironment;
|
namespace osmium
|
||||||
|
{
|
||||||
|
class Relation;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the relations that represents turn restrictions.
|
* Parses the relations that represents turn restrictions.
|
||||||
@ -63,8 +63,7 @@ class RestrictionParser
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RestrictionParser(lua_State *lua_state);
|
RestrictionParser(lua_State *lua_state);
|
||||||
mapbox::util::optional<InputRestrictionContainer>
|
boost::optional<InputRestrictionContainer> TryParse(const osmium::Relation &relation) const;
|
||||||
TryParse(const osmium::Relation &relation) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ReadUseRestrictionsSetting(lua_State *lua_state);
|
void ReadUseRestrictionsSetting(lua_State *lua_state);
|
||||||
|
@ -35,11 +35,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "../util/json_logger.hpp"
|
#include "../util/json_logger.hpp"
|
||||||
#include "../util/matching_debug_info.hpp"
|
#include "../util/matching_debug_info.hpp"
|
||||||
|
|
||||||
#include <variant/variant.hpp>
|
#include <cstddef>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <deque>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user