Chris@16: // Copyright (C) 2009 Andrew Sutton Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GRAPH_MUTABILITY_TRAITS_HPP Chris@16: #define BOOST_GRAPH_MUTABILITY_TRAITS_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: // The mutabiltiy categories classify graphs by their mutating operations Chris@16: // on the edge and vertex sets. This is a substantially more refined Chris@16: // categorization than the MutableGraph and MutablePropertyGraph denote. Chris@16: // Currently, this framework is only used in the graph tests to help Chris@16: // dispatch test to the correct places. However, there are probably some Chris@16: // constructive or destructive algorithms (i.e., graph generators) that Chris@16: // may use these to describe requirements on graph inputs. Chris@16: Chris@16: struct add_vertex_tag { }; Chris@16: struct add_vertex_property_tag : virtual add_vertex_tag { }; Chris@16: struct add_edge_tag { }; Chris@16: struct add_edge_property_tag : virtual add_edge_tag { }; Chris@16: struct remove_vertex_tag { }; Chris@16: struct remove_edge_tag { }; Chris@16: Chris@16: struct mutable_vertex_graph_tag Chris@16: : virtual add_vertex_tag, virtual remove_vertex_tag Chris@16: { }; Chris@16: struct mutable_vertex_property_graph_tag Chris@16: : virtual add_vertex_property_tag, virtual remove_vertex_tag Chris@16: { }; Chris@16: Chris@16: struct mutable_edge_graph_tag Chris@16: : virtual add_edge_tag, virtual remove_edge_tag Chris@16: { }; Chris@16: struct mutable_edge_property_graph_tag Chris@16: : virtual add_edge_property_tag, virtual remove_edge_tag Chris@16: { }; Chris@16: Chris@16: struct mutable_graph_tag Chris@16: : virtual mutable_vertex_graph_tag Chris@16: , virtual mutable_edge_graph_tag Chris@16: { }; Chris@16: struct mutable_property_graph_tag Chris@16: : virtual mutable_vertex_property_graph_tag Chris@16: , virtual mutable_edge_property_graph_tag Chris@16: { }; Chris@16: Chris@16: // Some graphs just don't like to be torn down. Note this only restricts Chris@16: // teardown to the set of vertices, not the vertex set. Chris@16: // TODO: Find a better name for this tag. Chris@16: struct add_only_property_graph_tag Chris@16: : virtual add_vertex_property_tag Chris@16: , virtual mutable_edge_property_graph_tag Chris@16: { }; Chris@16: Chris@16: /** Chris@16: * The graph_mutability_traits provide methods for determining the Chris@16: * interfaces supported by graph classes for adding and removing vertices Chris@16: * and edges. Chris@16: */ Chris@16: template Chris@16: struct graph_mutability_traits { Chris@16: typedef typename Graph::mutability_category category; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct graph_has_add_vertex Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: add_vertex_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct graph_has_add_vertex_with_property Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: add_vertex_property_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: Chris@16: template Chris@16: struct graph_has_remove_vertex Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: remove_vertex_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct graph_has_add_edge Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: add_edge_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct graph_has_add_edge_with_property Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: add_edge_property_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: Chris@16: template Chris@16: struct graph_has_remove_edge Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: remove_edge_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: Chris@16: template Chris@16: struct is_mutable_vertex_graph Chris@16: : mpl::and_< Chris@16: graph_has_add_vertex, Chris@16: graph_has_remove_vertex Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct is_mutable_vertex_property_graph Chris@16: : mpl::and_< Chris@16: graph_has_add_vertex_with_property, Chris@16: graph_has_remove_vertex Chris@16: > Chris@16: { }; Chris@16: Chris@16: Chris@16: template Chris@16: struct is_mutable_edge_graph Chris@16: : mpl::and_< Chris@16: graph_has_add_edge, Chris@16: graph_has_remove_edge Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct is_mutable_edge_property_graph Chris@16: : mpl::and_< Chris@16: graph_has_add_edge_with_property, Chris@16: graph_has_remove_edge Chris@16: > Chris@16: { }; Chris@16: Chris@16: Chris@16: template Chris@16: struct is_mutable_graph Chris@16: : mpl::and_< Chris@16: is_mutable_vertex_graph, Chris@16: is_mutable_edge_graph Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct is_mutable_property_graph Chris@16: : mpl::and_< Chris@16: is_mutable_vertex_property_graph, Chris@16: is_mutable_edge_property_graph Chris@16: > Chris@16: { }; Chris@16: Chris@16: template Chris@16: struct is_add_only_property_graph Chris@16: : mpl::bool_< Chris@16: is_convertible< Chris@16: typename graph_mutability_traits::category, Chris@16: add_only_property_graph_tag Chris@16: >::value Chris@16: > Chris@16: { }; Chris@16: Chris@16: /** @name Mutability Traits Specializations */ Chris@16: //@{ Chris@16: Chris@16: //@} Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif