annotate DEPENDENCIES/generic/include/boost/bimap/relation/detail/mutant.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost.Bimap
Chris@16 2 //
Chris@16 3 // Copyright (c) 2006-2007 Matias Capeletto
Chris@16 4 //
Chris@16 5 // Distributed under the Boost Software License, Version 1.0.
Chris@16 6 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 /// \file relation/detail/mutant.hpp
Chris@16 10 /// \brief Mutate functions to extract views of mutant classes.
Chris@16 11
Chris@16 12 #ifndef BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP
Chris@16 13 #define BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP
Chris@16 14
Chris@101 15 #if defined(_MSC_VER)
Chris@16 16 #pragma once
Chris@16 17 #endif
Chris@16 18
Chris@16 19 #include <boost/config.hpp>
Chris@16 20
Chris@16 21 #include <boost/bimap/detail/debug/static_error.hpp>
Chris@16 22 #include <boost/mpl/contains.hpp>
Chris@16 23 #include <boost/mpl/assert.hpp>
Chris@16 24 #include <boost/static_assert.hpp>
Chris@16 25 #include <boost/type_traits/is_const.hpp>
Chris@16 26 #include <boost/utility/addressof.hpp>
Chris@16 27 #include <boost/mpl/not.hpp>
Chris@16 28 #include <boost/utility/enable_if.hpp>
Chris@16 29
Chris@16 30 namespace boost {
Chris@16 31 namespace bimaps {
Chris@16 32 namespace relation {
Chris@16 33
Chris@16 34 /// \brief Relation details, mutant idiom and symmetrical metafunctions builders.
Chris@16 35
Chris@16 36 namespace detail {
Chris@16 37
Chris@16 38 //@{
Chris@16 39 /// \brief Converts a mutant class to a view with zero overhead.
Chris@16 40 /**
Chris@16 41
Chris@16 42 This function is a safe wrapper around reinterpret_cast. It checks at
Chris@16 43 compile time that the desired view is supported by the mutant class.
Chris@16 44 See also mutant, can_mutate_in.
Chris@16 45 \ingroup mutant_group
Chris@16 46 **/
Chris@16 47
Chris@16 48
Chris@16 49 template< class View, class Type >
Chris@16 50 BOOST_DEDUCED_TYPENAME enable_if< mpl::not_< is_const< Type > >,
Chris@16 51
Chris@16 52 View&
Chris@16 53
Chris@16 54 >::type mutate( Type & m )
Chris@16 55 {
Chris@16 56 BOOST_MPL_ASSERT((
Chris@16 57 ::boost::mpl::contains<BOOST_DEDUCED_TYPENAME Type::mutant_views,View>
Chris@16 58 ));
Chris@16 59 return *reinterpret_cast< View* >(boost::addressof(m));
Chris@16 60 }
Chris@16 61
Chris@16 62 template< class View, class Type >
Chris@16 63 BOOST_DEDUCED_TYPENAME enable_if< is_const< Type >,
Chris@16 64
Chris@16 65 const View&
Chris@16 66
Chris@16 67 >::type mutate( Type & m )
Chris@16 68 {
Chris@16 69 BOOST_MPL_ASSERT((
Chris@16 70 ::boost::mpl::contains<BOOST_DEDUCED_TYPENAME Type::mutant_views,View>
Chris@16 71 ));
Chris@16 72 return *reinterpret_cast< const View* >(boost::addressof(m));
Chris@16 73 }
Chris@16 74
Chris@16 75 //@}
Chris@16 76
Chris@16 77 } // namespace detail
Chris@16 78 } // namespace relation
Chris@16 79 } // namespace bimaps
Chris@16 80 } // namespace boost
Chris@16 81
Chris@16 82 #endif // BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP
Chris@16 83