// Boost.Bimap

//

// Copyright (c) 2006-2007 Matias Capeletto

//

// Distributed under 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)



/// \file relation/detail/to_mutable_relation_functor.hpp

/// \brief functors to convert types to mutable relations



#ifndef BOOST_BIMAP_RELATION_DETAIL_TO_MUTABLE_RELATION_FUNCTOR_HPP

#define BOOST_BIMAP_RELATION_DETAIL_TO_MUTABLE_RELATION_FUNCTOR_HPP



#if defined(_MSC_VER) && (_MSC_VER>=1200)

#pragma once

#endif



#include <boost/config.hpp>



#include <boost/bimap/relation/support/pair_type_by.hpp>

#include <boost/bimap/relation/detail/mutant.hpp>

#include <boost/bimap/relation/mutant_relation.hpp>



namespace boost {

namespace bimaps {

namespace relation {

namespace detail {



/// \brief Functor used in map views



template< class Tag, class Relation >

struct pair_to_relation_functor

{

    const Relation

        operator()(const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::

                            pair_type_by<Tag,Relation>::type & p) const

    {

        return Relation(p);

    }

};



template< class Tag, class TA, class TB, class Info >

struct pair_to_relation_functor<

    Tag,::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> >

{

    typedef ::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> Relation;



    Relation &

        operator()( BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::

            pair_type_by<Tag,Relation>::type & p ) const

    {

        return ::boost::bimaps::relation::detail::mutate<Relation>(p);

    }



    const Relation &

        operator()( const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::

            pair_type_by<Tag,Relation>::type & p) const

    {

        return ::boost::bimaps::relation::detail::mutate<Relation>(p);

    }

};





/// \brief Used in set views



template< class Relation >

struct get_mutable_relation_functor

{

    const Relation

    operator()( const BOOST_DEDUCED_TYPENAME Relation::above_view & r ) const

    {

        return Relation(r);

    }

};



template< class TA, class TB, class Info >

struct get_mutable_relation_functor< ::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> >

{

    typedef ::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> Relation;



    Relation &

    operator()( BOOST_DEDUCED_TYPENAME Relation::above_view & r ) const

    {

        return ::boost::bimaps::relation::detail::mutate<Relation>(r);

    }



    const Relation &

    operator()( const BOOST_DEDUCED_TYPENAME Relation::above_view & r ) const

    {

        return ::boost::bimaps::relation::detail::mutate<Relation>(r);

    }

};



} // namespace detail

} // namespace relation

} // namespace bimaps

} // namespace boost





#endif // BOOST_BIMAP_RELATION_DETAIL_TO_MUTABLE_RELATION_FUNCTOR_HPP



