2017-04-25 05:36:34 -04:00
|
|
|
#ifndef OSRM_EXTRACTOR_NODE_DATA_CONTAINER_HPP
|
|
|
|
#define OSRM_EXTRACTOR_NODE_DATA_CONTAINER_HPP
|
|
|
|
|
2017-05-19 18:28:01 -04:00
|
|
|
#include "extractor/travel_mode.hpp"
|
|
|
|
|
2017-04-25 05:36:34 -04:00
|
|
|
#include "storage/io_fwd.hpp"
|
|
|
|
#include "storage/shared_memory_ownership.hpp"
|
|
|
|
|
2017-05-19 18:28:01 -04:00
|
|
|
#include "util/permutation.hpp"
|
2017-04-25 05:36:34 -04:00
|
|
|
#include "util/typedefs.hpp"
|
|
|
|
#include "util/vector_view.hpp"
|
|
|
|
|
|
|
|
namespace osrm
|
|
|
|
{
|
|
|
|
namespace extractor
|
|
|
|
{
|
|
|
|
namespace detail
|
|
|
|
{
|
|
|
|
template <storage::Ownership Ownership> class EdgeBasedNodeDataContainerImpl;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace serialization
|
|
|
|
{
|
|
|
|
template <storage::Ownership Ownership>
|
|
|
|
void read(storage::io::FileReader &reader,
|
|
|
|
detail::EdgeBasedNodeDataContainerImpl<Ownership> &ebn_data);
|
|
|
|
|
|
|
|
template <storage::Ownership Ownership>
|
|
|
|
void write(storage::io::FileWriter &writer,
|
|
|
|
const detail::EdgeBasedNodeDataContainerImpl<Ownership> &ebn_data);
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace detail
|
|
|
|
{
|
|
|
|
template <storage::Ownership Ownership> class EdgeBasedNodeDataContainerImpl
|
|
|
|
{
|
|
|
|
template <typename T> using Vector = util::ViewOrVector<T, Ownership>;
|
2017-05-03 05:48:43 -04:00
|
|
|
using TravelMode = extractor::TravelMode;
|
2017-04-25 05:36:34 -04:00
|
|
|
|
|
|
|
public:
|
|
|
|
EdgeBasedNodeDataContainerImpl() = default;
|
|
|
|
|
2017-05-03 05:48:43 -04:00
|
|
|
EdgeBasedNodeDataContainerImpl(std::size_t size)
|
2017-05-15 06:15:00 -04:00
|
|
|
: geometry_ids(size), name_ids(size), component_ids(size), travel_modes(size)
|
2017-05-03 05:48:43 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-04-25 05:36:34 -04:00
|
|
|
EdgeBasedNodeDataContainerImpl(Vector<GeometryID> geometry_ids,
|
|
|
|
Vector<NameID> name_ids,
|
2017-05-15 06:15:00 -04:00
|
|
|
Vector<ComponentID> component_ids,
|
2017-05-03 05:48:43 -04:00
|
|
|
Vector<TravelMode> travel_modes)
|
2017-04-25 05:36:34 -04:00
|
|
|
: geometry_ids(std::move(geometry_ids)), name_ids(std::move(name_ids)),
|
2017-05-15 06:15:00 -04:00
|
|
|
component_ids(std::move(component_ids)), travel_modes(std::move(travel_modes))
|
2017-04-25 05:36:34 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-05-03 05:48:43 -04:00
|
|
|
GeometryID GetGeometryID(const NodeID node_id) const { return geometry_ids[node_id]; }
|
2017-04-25 05:36:34 -04:00
|
|
|
|
2017-05-03 05:48:43 -04:00
|
|
|
TravelMode GetTravelMode(const NodeID node_id) const { return travel_modes[node_id]; }
|
2017-04-25 05:36:34 -04:00
|
|
|
|
2017-05-03 05:48:43 -04:00
|
|
|
NameID GetNameID(const NodeID node_id) const { return name_ids[node_id]; }
|
2017-04-25 05:36:34 -04:00
|
|
|
|
2017-05-15 06:15:00 -04:00
|
|
|
ComponentID GetComponentID(const NodeID node_id) const { return component_ids[node_id]; }
|
|
|
|
|
2017-04-25 05:36:34 -04:00
|
|
|
// Used by EdgeBasedGraphFactory to fill data structure
|
|
|
|
template <typename = std::enable_if<Ownership == storage::Ownership::Container>>
|
2017-05-03 05:48:43 -04:00
|
|
|
void SetData(NodeID node_id, GeometryID geometry_id, NameID name_id, TravelMode travel_mode)
|
2017-04-25 05:36:34 -04:00
|
|
|
{
|
2017-05-03 05:48:43 -04:00
|
|
|
geometry_ids[node_id] = geometry_id;
|
|
|
|
name_ids[node_id] = name_id;
|
|
|
|
travel_modes[node_id] = travel_mode;
|
2017-04-25 05:36:34 -04:00
|
|
|
}
|
|
|
|
|
2017-05-15 06:15:00 -04:00
|
|
|
// Used by EdgeBasedGraphFactory to fill data structure
|
|
|
|
template <typename = std::enable_if<Ownership == storage::Ownership::Container>>
|
2017-05-16 13:22:41 -04:00
|
|
|
void SetComponentID(NodeID node_id, ComponentID component_id)
|
2017-05-15 06:15:00 -04:00
|
|
|
{
|
|
|
|
component_ids[node_id] = component_id;
|
|
|
|
}
|
|
|
|
|
2017-04-25 05:36:34 -04:00
|
|
|
friend void serialization::read<Ownership>(storage::io::FileReader &reader,
|
|
|
|
EdgeBasedNodeDataContainerImpl &ebn_data_container);
|
|
|
|
friend void
|
|
|
|
serialization::write<Ownership>(storage::io::FileWriter &writer,
|
|
|
|
const EdgeBasedNodeDataContainerImpl &ebn_data_container);
|
|
|
|
|
2017-05-19 18:28:01 -04:00
|
|
|
template <typename = std::enable_if<Ownership == storage::Ownership::Container>>
|
|
|
|
void Renumber(const std::vector<std::uint32_t> &permutation)
|
|
|
|
{
|
|
|
|
util::inplacePermutation(geometry_ids.begin(), geometry_ids.end(), permutation);
|
|
|
|
util::inplacePermutation(name_ids.begin(), name_ids.end(), permutation);
|
|
|
|
util::inplacePermutation(component_ids.begin(), component_ids.end(), permutation);
|
|
|
|
util::inplacePermutation(travel_modes.begin(), travel_modes.end(), permutation);
|
|
|
|
}
|
|
|
|
|
2017-04-25 05:36:34 -04:00
|
|
|
private:
|
|
|
|
Vector<GeometryID> geometry_ids;
|
|
|
|
Vector<NameID> name_ids;
|
2017-05-15 06:15:00 -04:00
|
|
|
Vector<ComponentID> component_ids;
|
2017-05-03 05:48:43 -04:00
|
|
|
Vector<TravelMode> travel_modes;
|
2017-04-25 05:36:34 -04:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
using EdgeBasedNodeDataExternalContainer =
|
|
|
|
detail::EdgeBasedNodeDataContainerImpl<storage::Ownership::External>;
|
|
|
|
using EdgeBasedNodeDataContainer =
|
|
|
|
detail::EdgeBasedNodeDataContainerImpl<storage::Ownership::Container>;
|
|
|
|
using EdgeBasedNodeDataView = detail::EdgeBasedNodeDataContainerImpl<storage::Ownership::View>;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|