diff options
Diffstat (limited to 'boost/bimap/relation/detail/access_builder.hpp')
-rw-r--r-- | boost/bimap/relation/detail/access_builder.hpp | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/boost/bimap/relation/detail/access_builder.hpp b/boost/bimap/relation/detail/access_builder.hpp new file mode 100644 index 0000000000..a1e939f827 --- /dev/null +++ b/boost/bimap/relation/detail/access_builder.hpp @@ -0,0 +1,170 @@ +// 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/access_builder.hpp +/// \brief Define macros to help building metafunctions + +#ifndef BOOST_BIMAP_RELATION_ACCESS_BUILDER_HPP +#define BOOST_BIMAP_RELATION_ACCESS_BUILDER_HPP + +#if defined(_MSC_VER) && (_MSC_VER>=1200) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/member_with_tag.hpp> +#include <boost/bimap/relation/member_at.hpp> +#include <boost/call_traits.hpp> +#include <boost/type_traits/is_const.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/not.hpp> +#include <boost/utility/enable_if.hpp> + + +/****************************************************************************** + BIMAP SYMMETRIC ACCESS RESULT OF +******************************************************************************* + +namespace result_of { + +template< class Tag, class SymmetricType > +struct NAME +{ + typedef -unspecified- type; +}; + +} // namespace result_of + +******************************************************************************/ + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_ACCESS_RESULT_OF_BUILDER( \ + \ + NAME, \ + METAFUNCTION_BASE \ + ) \ + \ + namespace result_of { \ + \ + template< class Tag, class SymmetricType > \ + struct NAME \ + { \ + typedef BOOST_DEDUCED_TYPENAME METAFUNCTION_BASE \ + < \ + Tag,SymmetricType \ + \ + >::type value_type; \ + \ + typedef BOOST_DEDUCED_TYPENAME mpl::if_< is_const<SymmetricType>, \ + \ + BOOST_DEDUCED_TYPENAME call_traits<value_type>::const_reference, \ + \ + BOOST_DEDUCED_TYPENAME call_traits<value_type>::reference \ + \ + >::type type; \ + }; \ + \ + } +/*===========================================================================*/ + + + +/****************************************************************************** + BIMAP SYMMETRIC ACCESS IMPLEMENTATION +******************************************************************************* + +namespace detail { + +template< class Tag, class SymmetricType > +typename result_of::NAME<Tag,SymmetricType>::type + NAME( Tag , const Relation & ); + +} // namespace detail + +******************************************************************************/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_ACCESS_IMPLEMENTATION_BUILDER( \ + \ + NAME, \ + TP_SYMMETRIC, \ + PARAMETER_NAME, \ + LEFT_BODY, \ + RIGHT_BODY \ + ) \ + \ + namespace detail { \ + \ + \ + \ + template< class TP_SYMMETRIC > \ + BOOST_DEDUCED_TYPENAME result_of::NAME \ + < \ + ::boost::bimaps::relation::member_at::left,TP_SYMMETRIC \ + \ + >::type \ + \ + NAME( ::boost::bimaps::relation::member_at::left, \ + TP_SYMMETRIC & PARAMETER_NAME ) \ + { \ + LEFT_BODY; \ + } \ + \ + template< class TP_SYMMETRIC > \ + BOOST_DEDUCED_TYPENAME result_of::NAME \ + < \ + ::boost::bimaps::relation::member_at::right,TP_SYMMETRIC \ + \ + >::type \ + \ + NAME( ::boost::bimaps::relation::member_at::right, \ + TP_SYMMETRIC & PARAMETER_NAME ) \ + { \ + RIGHT_BODY; \ + } \ + \ + } +/*===========================================================================*/ + + +/****************************************************************************** + BIMAP RELATION ACCESS INTERFACE +******************************************************************************* + +template< class Tag, class SymmetricType > +typename result_of::NAME<Tag,SymmetricType>::type + NAME( const SymmetricType & ); + +******************************************************************************/ + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_ACCESS_INTERFACE_BUILDER( \ + \ + NAME \ + ) \ + \ + template< class Tag, class SymmetricType > \ + BOOST_DEDUCED_TYPENAME result_of::NAME<Tag,SymmetricType>::type \ + NAME( SymmetricType & s ) \ + { \ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: \ + member_with_tag \ + < \ + Tag,SymmetricType \ + \ + >::type member_at_tag; \ + \ + return detail::NAME(member_at_tag(),s); \ + } +/*===========================================================================*/ + + +#endif // BOOST_BIMAP_RELATION_ACCESS_BUILDER_HPP + |