You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
237 lines
6.8 KiB
237 lines
6.8 KiB
// Copyright (C) 2009 Andrew Sutton |
|
|
|
// Use, modification and distribution is subject to the Boost Software |
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#ifndef BOOST_GRAPH_LABELED_GRAPH_TRAITS_HPP |
|
#define BOOST_GRAPH_LABELED_GRAPH_TRAITS_HPP |
|
|
|
#include <boost/graph/graph_mutability_traits.hpp> |
|
|
|
namespace boost { |
|
|
|
// Extend the graph mutability traits (and metafunctions) to include options |
|
// for labeled graphs. |
|
|
|
// NOTE: the label_vertex tag denotes the fact that you can basically assign |
|
// arbitrary labels to vertices without modifying the actual graph. |
|
|
|
// TODO: We might also overlay the uniqueness/multiplicity of labels in this |
|
// hierarchy also. For now, we just assumed that labels are unique. |
|
|
|
struct label_vertex_tag { }; |
|
struct labeled_add_vertex_tag : virtual label_vertex_tag { }; |
|
struct labeled_add_vertex_property_tag : virtual labeled_add_vertex_tag { }; |
|
struct labeled_remove_vertex_tag { }; |
|
struct labeled_add_edge_tag : virtual label_vertex_tag { }; |
|
struct labeled_add_edge_property_tag : virtual labeled_add_edge_tag{ }; |
|
struct labeled_remove_edge_tag { }; |
|
|
|
struct labeled_mutable_vertex_graph_tag |
|
: virtual labeled_add_vertex_tag, virtual labeled_remove_vertex_tag |
|
{ }; |
|
struct labeled_mutable_vertex_property_graph_tag |
|
: virtual labeled_add_vertex_property_tag, virtual labeled_remove_vertex_tag |
|
{ }; |
|
struct labeled_mutable_edge_graph_tag |
|
: virtual labeled_add_edge_tag, virtual labeled_remove_edge_tag |
|
{ }; |
|
struct labeled_mutable_edge_property_graph_tag |
|
: virtual labeled_add_edge_property_tag, virtual labeled_remove_edge_tag |
|
{ }; |
|
|
|
struct labeled_graph_tag |
|
: virtual label_vertex_tag |
|
{ }; |
|
struct labeled_mutable_graph_tag |
|
: virtual labeled_mutable_vertex_graph_tag |
|
, virtual labeled_mutable_edge_graph_tag |
|
{ }; |
|
struct labeled_mutable_property_graph_tag |
|
: virtual labeled_mutable_vertex_property_graph_tag |
|
, virtual labeled_mutable_edge_property_graph_tag |
|
{ }; |
|
struct labeled_add_only_property_graph_tag |
|
: virtual labeled_add_vertex_property_tag |
|
, virtual labeled_mutable_edge_property_graph_tag |
|
{ }; |
|
|
|
// Metafunctions |
|
|
|
template <typename Graph> |
|
struct graph_has_add_vertex_by_label |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_add_vertex_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct graph_has_add_vertex_by_label_with_property |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_add_vertex_property_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct graph_has_remove_vertex_by_label |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_remove_vertex_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct graph_has_add_edge_by_label |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_add_edge_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct graph_has_add_edge_by_label_with_property |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_add_edge_property_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct graph_has_remove_edge_by_label |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_remove_edge_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_mutable_vertex_graph |
|
: mpl::and_< |
|
graph_has_add_vertex_by_label<Graph>, |
|
graph_has_remove_vertex_by_label<Graph> |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_mutable_vertex_property_graph |
|
: mpl::and_< |
|
graph_has_add_vertex_by_label<Graph>, |
|
graph_has_remove_vertex_by_label<Graph> |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_mutable_edge_graph |
|
: mpl::and_< |
|
graph_has_add_edge_by_label<Graph>, |
|
graph_has_remove_edge_by_label<Graph> |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_mutable_edge_property_graph |
|
: mpl::and_< |
|
graph_has_add_edge_by_label<Graph>, |
|
graph_has_remove_edge_by_label<Graph> |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_mutable_graph |
|
: mpl::and_< |
|
is_labeled_mutable_vertex_graph<Graph>, |
|
is_labeled_mutable_edge_graph<Graph> |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_mutable_property_graph |
|
: mpl::and_< |
|
is_labeled_mutable_vertex_property_graph<Graph>, |
|
is_labeled_mutable_edge_property_graph<Graph> |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_add_only_property_graph |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
labeled_add_only_property_graph_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename Graph> |
|
struct is_labeled_graph |
|
: mpl::bool_< |
|
is_convertible< |
|
typename graph_mutability_traits<Graph>::category, |
|
label_vertex_tag |
|
>::value |
|
> |
|
{ }; |
|
|
|
template <typename> struct graph_mutability_traits; |
|
|
|
namespace graph_detail { |
|
// The determine mutability metafunction computes a labeled mutability tag |
|
// based on the mutability of the given graph type. This is used by the |
|
// graph_mutability_traits specialization below. |
|
template <typename Graph> |
|
struct determine_mutability { |
|
typedef typename mpl::if_< |
|
is_add_only_property_graph<Graph>, |
|
labeled_add_only_property_graph_tag, |
|
typename mpl::if_< |
|
is_mutable_property_graph<Graph>, |
|
labeled_mutable_property_graph_tag, |
|
typename mpl::if_< |
|
is_mutable_graph<Graph>, |
|
labeled_mutable_graph_tag, |
|
typename mpl::if_< |
|
is_mutable_edge_graph<Graph>, |
|
labeled_graph_tag, |
|
typename graph_mutability_traits<Graph>::category |
|
>::type |
|
>::type |
|
>::type |
|
>::type type; |
|
}; |
|
} // namespace graph_detail |
|
|
|
#define LABELED_GRAPH_PARAMS typename G, typename L, typename S |
|
#define LABELED_GRAPH labeled_graph<G,L,S> |
|
|
|
// Specialize mutability traits for for the labeled graph. |
|
// This specialization depends on the mutability of the underlying graph type. |
|
// If the underlying graph is fully mutable, this this is also fully mutable. |
|
// Otherwise, it's different. |
|
template <LABELED_GRAPH_PARAMS> |
|
struct graph_mutability_traits< LABELED_GRAPH > { |
|
typedef typename graph_detail::determine_mutability< |
|
typename LABELED_GRAPH::graph_type |
|
>::type category; |
|
}; |
|
|
|
#undef LABELED_GRAPH_PARAMS |
|
#undef LABELED_GRAPH |
|
|
|
} // namespace boost |
|
|
|
#endif
|
|
|