123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // 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)
- #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
|