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/fstream.hpp>
|
||||
#include <boost/optional/optional.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/task_scheduler_init.h>
|
||||
|
||||
#include <variant/optional.hpp>
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
#include <algorithm>
|
||||
@ -151,8 +150,7 @@ int extractor::run()
|
||||
// initialize vectors holding parsed objects
|
||||
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<mapbox::util::optional<InputRestrictionContainer>>
|
||||
resulting_restrictions;
|
||||
tbb::concurrent_vector<boost::optional<InputRestrictionContainer>> resulting_restrictions;
|
||||
|
||||
// setup restriction parser
|
||||
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/simple_logger.hpp"
|
||||
|
||||
#include <boost/optional/optional.hpp>
|
||||
|
||||
#include <osmium/osm.hpp>
|
||||
|
||||
#include <osrm/coordinate.hpp>
|
||||
|
||||
#include <limits>
|
||||
@ -65,7 +69,7 @@ void ExtractorCallbacks::ProcessNode(const osmium::Node &input_node,
|
||||
}
|
||||
|
||||
void ExtractorCallbacks::ProcessRestriction(
|
||||
const mapbox::util::optional<InputRestrictionContainer> &restriction)
|
||||
const boost::optional<InputRestrictionContainer> &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
|
||||
&& backward_weight_data.type == InternalExtractorEdge::WeightType::INVALID)
|
||||
if (forward_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();
|
||||
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::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;
|
||||
|
||||
@ -182,53 +189,51 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti
|
||||
[&](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,
|
||||
true, false, parsed_way.roundabout, parsed_way.is_access_restricted,
|
||||
first_node.ref(), last_node.ref(), name_id,
|
||||
backward_weight_data, true, false, parsed_way.roundabout,
|
||||
parsed_way.is_access_restricted,
|
||||
parsed_way.backward_travel_mode, false));
|
||||
});
|
||||
|
||||
external_memory.way_start_end_id_list.push_back(
|
||||
{
|
||||
static_cast<EdgeID>(input_way.id()),
|
||||
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()[1].ref()),
|
||||
static_cast<NodeID>(input_way.nodes()[0].ref())
|
||||
}
|
||||
);
|
||||
{static_cast<EdgeID>(input_way.id()),
|
||||
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()[1].ref()),
|
||||
static_cast<NodeID>(input_way.nodes()[0].ref())});
|
||||
}
|
||||
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(),
|
||||
[&](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, forward_weight_data,
|
||||
true, !forward_only, parsed_way.roundabout, parsed_way.is_access_restricted,
|
||||
parsed_way.forward_travel_mode, split_edge));
|
||||
true, !forward_only, parsed_way.roundabout,
|
||||
parsed_way.is_access_restricted, parsed_way.forward_travel_mode,
|
||||
split_edge));
|
||||
});
|
||||
if (split_edge)
|
||||
{
|
||||
BOOST_ASSERT(parsed_way.backward_travel_mode != TRAVEL_MODE_INACCESSIBLE);
|
||||
osrm::for_each_pair(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,
|
||||
false, true, parsed_way.roundabout, parsed_way.is_access_restricted,
|
||||
parsed_way.backward_travel_mode, true));
|
||||
});
|
||||
osrm::for_each_pair(
|
||||
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, false,
|
||||
true, parsed_way.roundabout, parsed_way.is_access_restricted,
|
||||
parsed_way.backward_travel_mode, true));
|
||||
});
|
||||
}
|
||||
|
||||
external_memory.way_start_end_id_list.push_back(
|
||||
{
|
||||
static_cast<EdgeID>(input_way.id()),
|
||||
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()[1].ref()),
|
||||
static_cast<NodeID>(input_way.nodes()[0].ref())
|
||||
}
|
||||
);
|
||||
{static_cast<EdgeID>(input_way.id()),
|
||||
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()[1].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
|
||||
#define EXTRACTOR_CALLBACKS_HPP
|
||||
|
||||
#include "extraction_way.hpp"
|
||||
#include "../typedefs.h"
|
||||
|
||||
#include <osmium/osm.hpp>
|
||||
|
||||
#include <variant/optional.hpp>
|
||||
#include <boost/optional/optional_fwd.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
@ -42,6 +38,12 @@ struct ExternalMemoryNode;
|
||||
class ExtractionContainers;
|
||||
struct InputRestrictionContainer;
|
||||
struct ExtractionNode;
|
||||
struct ExtractionWay;
|
||||
namespace osmium
|
||||
{
|
||||
class Node;
|
||||
class Way;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
// 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!
|
||||
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/ref.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
#include <boost/optional/optional.hpp>
|
||||
|
||||
#include <osmium/osm.hpp>
|
||||
#include <osmium/tags/regex_filter.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
|
||||
namespace
|
||||
{
|
||||
int lua_error_callback(lua_State *lua_state)
|
||||
{
|
||||
std::string error_msg = lua_tostring(lua_state, -1);
|
||||
std::ostringstream error_stream;
|
||||
error_stream << error_msg;
|
||||
throw osrm::exception("ERROR occured in profile script:\n" + error_stream.str());
|
||||
throw osrm::exception("ERROR occured in profile script:\n" + error_msg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
* 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
|
||||
* in the corresponding profile.
|
||||
*/
|
||||
mapbox::util::optional<InputRestrictionContainer>
|
||||
boost::optional<InputRestrictionContainer>
|
||||
RestrictionParser::TryParse(const osmium::Relation &relation) const
|
||||
{
|
||||
// return if turn restrictions should be ignored
|
||||
if (!use_turn_restrictions)
|
||||
{
|
||||
return mapbox::util::optional<InputRestrictionContainer>();
|
||||
return {};
|
||||
}
|
||||
|
||||
osmium::tags::KeyPrefixFilter filter(false);
|
||||
@ -129,14 +132,14 @@ RestrictionParser::TryParse(const osmium::Relation &relation) const
|
||||
// if it's a restriction, continue;
|
||||
if (std::distance(fi_begin, fi_end) == 0)
|
||||
{
|
||||
return mapbox::util::optional<InputRestrictionContainer>();
|
||||
return {};
|
||||
}
|
||||
|
||||
// check if the restriction should be ignored
|
||||
const char *except = relation.get_value_by_key("except");
|
||||
if (except != nullptr && ShouldIgnoreRestriction(except))
|
||||
{
|
||||
return mapbox::util::optional<InputRestrictionContainer>();
|
||||
return {};
|
||||
}
|
||||
|
||||
bool is_only_restriction = false;
|
||||
@ -164,7 +167,7 @@ RestrictionParser::TryParse(const osmium::Relation &relation) const
|
||||
|
||||
if (!is_actually_restricted)
|
||||
{
|
||||
return mapbox::util::optional<InputRestrictionContainer>();
|
||||
return {};
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -218,7 +221,7 @@ RestrictionParser::TryParse(const osmium::Relation &relation) const
|
||||
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
|
||||
|
@ -30,16 +30,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "../data_structures/restriction.hpp"
|
||||
|
||||
#include <osmium/osm.hpp>
|
||||
#include <osmium/tags/regex_filter.hpp>
|
||||
|
||||
#include <variant/optional.hpp>
|
||||
#include <boost/optional/optional_fwd.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct lua_State;
|
||||
class ScriptingEnvironment;
|
||||
namespace osmium
|
||||
{
|
||||
class Relation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the relations that represents turn restrictions.
|
||||
@ -63,8 +63,7 @@ class RestrictionParser
|
||||
{
|
||||
public:
|
||||
RestrictionParser(lua_State *lua_state);
|
||||
mapbox::util::optional<InputRestrictionContainer>
|
||||
TryParse(const osmium::Relation &relation) const;
|
||||
boost::optional<InputRestrictionContainer> TryParse(const osmium::Relation &relation) const;
|
||||
|
||||
private:
|
||||
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/matching_debug_info.hpp"
|
||||
|
||||
#include <variant/variant.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
#include <iomanip>
|
||||
#include <numeric>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user