Partitioner Improvements and Utils on top of #3603 (#3611)

* 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:
Daniel J. H
2017-01-25 10:59:27 +01:00
committed by Patrick Niklaus
parent d56db500d3
commit dd3f351874
6 changed files with 141 additions and 50 deletions
+8 -2
View File
@@ -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;
+56
View File
@@ -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