* Implements Random Access Iterator Facade for EdgeIDIterator * Makes StaticGraph Node and Edge requirements explicit * Cleans up Bisection Graph, Node and Edge * Cleans up GraphView
This commit is contained in:
committed by
Patrick Niklaus
parent
d56db500d3
commit
dd3f351874
@@ -4,6 +4,7 @@
|
||||
#include "util/integer_range.hpp"
|
||||
#include "util/percent.hpp"
|
||||
#include "util/shared_memory_vector_wrapper.hpp"
|
||||
#include "util/static_graph_traits.hpp"
|
||||
#include "util/typedefs.hpp"
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
@@ -62,6 +63,11 @@ template <typename EdgeDataT> class SortableEdgeWithData
|
||||
|
||||
template <typename NodeT, typename EdgeT, bool UseSharedMemory = false> class FlexibleStaticGraph
|
||||
{
|
||||
static_assert(traits::HasFirstEdgeMember<NodeT>(),
|
||||
"Model for compatible Node type requires .first_edge member attribute");
|
||||
static_assert(traits::HasDataAndTargetMember<EdgeT>(),
|
||||
"Model for compatible Edge type requires .data and .target member attribute");
|
||||
|
||||
public:
|
||||
using NodeIterator = static_graph_details::NodeIterator;
|
||||
using EdgeIterator = static_graph_details::EdgeIterator;
|
||||
@@ -210,8 +216,8 @@ template <typename NodeT, typename EdgeT, bool UseSharedMemory = false> class Fl
|
||||
return current_iterator;
|
||||
}
|
||||
|
||||
const NodeArrayEntry& GetNode(const NodeID nid) const { return node_array[nid]; }
|
||||
const EdgeArrayEntry& GetEdge(const EdgeID eid) const { return edge_array[eid]; }
|
||||
const NodeArrayEntry &GetNode(const NodeID nid) const { return node_array[nid]; }
|
||||
const EdgeArrayEntry &GetEdge(const EdgeID eid) const { return edge_array[eid]; }
|
||||
|
||||
private:
|
||||
NodeIterator number_of_nodes;
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
#ifndef STATIC_GRAPH_TRAITS_HPP
|
||||
#define STATIC_GRAPH_TRAITS_HPP
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
namespace util
|
||||
{
|
||||
|
||||
namespace traits
|
||||
{
|
||||
|
||||
// Introspection for an arbitrary .data member attribute
|
||||
template <typename T, typename = void> struct HasDataMember : std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct HasDataMember<T, decltype((void)(sizeof(std::declval<T>().data) > 0))> : std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
// Introspection for an arbitrary .target member attribute
|
||||
template <typename T, typename = void> struct HasTargetMember : std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct HasTargetMember<T, decltype((void)(sizeof(std::declval<T>().target) > 0))> : std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
// Static Graph requires edges to have a .target and .data member attribute
|
||||
template <typename Edge>
|
||||
struct HasDataAndTargetMember
|
||||
: std::integral_constant<bool, HasDataMember<Edge>() && HasTargetMember<Edge>()>
|
||||
{
|
||||
};
|
||||
|
||||
// Static Graph requires nodes to have a .first_edge member attribute
|
||||
template <typename T, typename = void> struct HasFirstEdgeMember : std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct HasFirstEdgeMember<T, decltype((void)(sizeof(std::declval<T>().first_edge) > 0))>
|
||||
: std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
} // ns traits
|
||||
} // ns util
|
||||
} // ns osrm
|
||||
|
||||
#endif // STATIC_GRAPH_TRAITS_HPP
|
||||
Reference in New Issue
Block a user