// 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 |