// 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_MUTABILITY_TRAITS_HPP | |
#define BOOST_GRAPH_MUTABILITY_TRAITS_HPP | |
#include <boost/config.hpp> | |
#include <boost/mpl/if.hpp> | |
#include <boost/mpl/and.hpp> | |
#include <boost/mpl/bool.hpp> | |
#include <boost/type_traits/is_same.hpp> | |
namespace boost { | |
// The mutabiltiy categories classify graphs by their mutating operations | |
// on the edge and vertex sets. This is a substantially more refined | |
// categorization than the MutableGraph and MutablePropertyGraph denote. | |
// Currently, this framework is only used in the graph tests to help | |
// dispatch test to the correct places. However, there are probably some | |
// constructive or destructive algorithms (i.e., graph generators) that | |
// may use these to describe requirements on graph inputs. | |
struct add_vertex_tag { }; | |
struct add_vertex_property_tag : virtual add_vertex_tag { }; | |
struct add_edge_tag { }; | |
struct add_edge_property_tag : virtual add_edge_tag { }; | |
struct remove_vertex_tag { }; | |
struct remove_edge_tag { }; | |
struct mutable_vertex_graph_tag | |
: virtual add_vertex_tag, virtual remove_vertex_tag | |
{ }; | |
struct mutable_vertex_property_graph_tag | |
: virtual add_vertex_property_tag, virtual remove_vertex_tag | |
{ }; | |
struct mutable_edge_graph_tag | |
: virtual add_edge_tag, virtual remove_edge_tag | |
{ }; | |
struct mutable_edge_property_graph_tag | |
: virtual add_edge_property_tag, virtual remove_edge_tag | |
{ }; | |
struct mutable_graph_tag | |
: virtual mutable_vertex_graph_tag | |
, virtual mutable_edge_graph_tag | |
{ }; | |
struct mutable_property_graph_tag | |
: virtual mutable_vertex_property_graph_tag | |
, virtual mutable_edge_property_graph_tag | |
{ }; | |
// Some graphs just don't like to be torn down. Note this only restricts | |
// teardown to the set of vertices, not the vertex set. | |
// TODO: Find a better name for this tag. | |
struct add_only_property_graph_tag | |
: virtual add_vertex_property_tag | |
, virtual mutable_edge_property_graph_tag | |
{ }; | |
/** | |
* The graph_mutability_traits provide methods for determining the | |
* interfaces supported by graph classes for adding and removing vertices | |
* and edges. | |
*/ | |
template <typename Graph> | |
struct graph_mutability_traits { | |
typedef typename Graph::mutability_category category; | |
}; | |
template <typename Graph> | |
struct graph_has_add_vertex | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
add_vertex_tag | |
>::value | |
> | |
{ }; | |
template <typename Graph> | |
struct graph_has_add_vertex_with_property | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
add_vertex_property_tag | |
>::value | |
> | |
{ }; | |
template <typename Graph> | |
struct graph_has_remove_vertex | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
remove_vertex_tag | |
>::value | |
> | |
{ }; | |
template <typename Graph> | |
struct graph_has_add_edge | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
add_edge_tag | |
>::value | |
> | |
{ }; | |
template <typename Graph> | |
struct graph_has_add_edge_with_property | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
add_edge_property_tag | |
>::value | |
> | |
{ }; | |
template <typename Graph> | |
struct graph_has_remove_edge | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
remove_edge_tag | |
>::value | |
> | |
{ }; | |
template <typename Graph> | |
struct is_mutable_vertex_graph | |
: mpl::and_< | |
graph_has_add_vertex<Graph>, | |
graph_has_remove_vertex<Graph> | |
> | |
{ }; | |
template <typename Graph> | |
struct is_mutable_vertex_property_graph | |
: mpl::and_< | |
graph_has_add_vertex_with_property<Graph>, | |
graph_has_remove_vertex<Graph> | |
> | |
{ }; | |
template <typename Graph> | |
struct is_mutable_edge_graph | |
: mpl::and_< | |
graph_has_add_edge<Graph>, | |
graph_has_remove_edge<Graph> | |
> | |
{ }; | |
template <typename Graph> | |
struct is_mutable_edge_property_graph | |
: mpl::and_< | |
graph_has_add_edge_with_property<Graph>, | |
graph_has_remove_edge<Graph> | |
> | |
{ }; | |
template <typename Graph> | |
struct is_mutable_graph | |
: mpl::and_< | |
is_mutable_vertex_graph<Graph>, | |
is_mutable_edge_graph<Graph> | |
> | |
{ }; | |
template <typename Graph> | |
struct is_mutable_property_graph | |
: mpl::and_< | |
is_mutable_vertex_property_graph<Graph>, | |
is_mutable_edge_property_graph<Graph> | |
> | |
{ }; | |
template <typename Graph> | |
struct is_add_only_property_graph | |
: mpl::bool_< | |
is_convertible< | |
typename graph_mutability_traits<Graph>::category, | |
add_only_property_graph_tag | |
>::value | |
> | |
{ }; | |
/** @name Mutability Traits Specializations */ | |
//@{ | |
//@} | |
} // namespace boost | |
#endif |