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