| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // 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/mutant.hpp
- /// \brief Mutate functions to extract views of mutant classes.
- #ifndef BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP
- #define BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #include <boost/config.hpp>
- #include <boost/bimap/detail/debug/static_error.hpp>
- #include <boost/mpl/contains.hpp>
- #include <boost/mpl/assert.hpp>
- #include <boost/static_assert.hpp>
- #include <boost/type_traits/is_const.hpp>
- #include <boost/utility/addressof.hpp>
- #include <boost/mpl/not.hpp>
- #include <boost/utility/enable_if.hpp>
- namespace boost {
- namespace bimaps {
- namespace relation {
- /// \brief Relation details, mutant idiom and symmetrical metafunctions builders.
- namespace detail {
- //@{
- /// \brief Converts a mutant class to a view with zero overhead.
- /**
- This function is a safe wrapper around reinterpret_cast. It checks at
- compile time that the desired view is supported by the mutant class.
- See also mutant, can_mutate_in.
- \ingroup mutant_group
- **/
- template< class View, class Type >
- BOOST_DEDUCED_TYPENAME enable_if< mpl::not_< is_const< Type > >,
- View&
- >::type mutate( Type & m )
- {
- BOOST_MPL_ASSERT((
- ::boost::mpl::contains<BOOST_DEDUCED_TYPENAME Type::mutant_views,View>
- ));
- return *reinterpret_cast< View* >(boost::addressof(m));
- }
- template< class View, class Type >
- BOOST_DEDUCED_TYPENAME enable_if< is_const< Type >,
- const View&
- >::type mutate( Type & m )
- {
- BOOST_MPL_ASSERT((
- ::boost::mpl::contains<BOOST_DEDUCED_TYPENAME Type::mutant_views,View>
- ));
- return *reinterpret_cast< const View* >(boost::addressof(m));
- }
- //@}
- } // namespace detail
- } // namespace relation
- } // namespace bimaps
- } // namespace boost
- #endif // BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP
|