1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2008-2009. Distributed under the Boost 4 // Software License, Version 1.0. (See accompanying file 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // See http://www.boost.org/libs/interprocess for documentation. 8 // 9 ////////////////////////////////////////////////////////////////////////////// 10 11 #ifndef BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP 12 #define BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP 13 14 #if (defined _MSC_VER) && (_MSC_VER >= 1200) 15 # pragma once 16 #endif 17 18 #include "config_begin.hpp" 19 20 #ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING 21 #error "This file is not needed when perfect forwarding is available" 22 #endif 23 24 #include <boost/preprocessor/iteration/local.hpp> 25 #include <boost/preprocessor/repetition/enum_params.hpp> 26 #include <boost/preprocessor/cat.hpp> 27 #include <boost/preprocessor/repetition/enum.hpp> 28 #include <boost/preprocessor/repetition/repeat.hpp> 29 30 #define BOOST_INTERPROCESS_MAX_CONSTRUCTOR_PARAMETERS 10 31 32 //Note: 33 //We define template parameters as const references to 34 //be able to bind temporaries. After that we will un-const them. 35 //This cast is ugly but it is necessary until "perfect forwarding" 36 //is achieved in C++0x. Meanwhile, if we want to be able to 37 //bind rvalues with non-const references, we have to be ugly 38 #ifndef BOOST_NO_RVALUE_REFERENCES 39 #define BOOST_INTERPROCESS_PP_PARAM_LIST(z, n, data) \ 40 BOOST_PP_CAT(P, n) && BOOST_PP_CAT(p, n) \ 41 //! 42 #else 43 #define BOOST_INTERPROCESS_PP_PARAM_LIST(z, n, data) \ 44 const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) \ 45 //! 46 #endif 47 48 #ifndef BOOST_NO_RVALUE_REFERENCES 49 #define BOOST_INTERPROCESS_PARAM(U, u) \ 50 U && u \ 51 //! 52 #else 53 #define BOOST_INTERPROCESS_PARAM(U, u) \ 54 const U & u \ 55 //! 56 #endif 57 58 #ifndef BOOST_NO_RVALUE_REFERENCES 59 60 #ifdef BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES 61 62 #define BOOST_INTERPROCESS_AUX_PARAM_INIT(z, n, data) \ 63 BOOST_PP_CAT(m_p, n) (BOOST_INTERPROCESS_MOVE_NAMESPACE::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) )) \ 64 //! 65 66 #else 67 68 #define BOOST_INTERPROCESS_AUX_PARAM_INIT(z, n, data) \ 69 BOOST_PP_CAT(m_p, n) (BOOST_PP_CAT(p, n)) \ 70 //! 71 72 #endif 73 74 #else 75 #define BOOST_INTERPROCESS_AUX_PARAM_INIT(z, n, data) \ 76 BOOST_PP_CAT(m_p, n) (const_cast<BOOST_PP_CAT(P, n) &>(BOOST_PP_CAT(p, n))) \ 77 //! 78 #endif 79 80 #define BOOST_INTERPROCESS_AUX_PARAM_INC(z, n, data) \ 81 BOOST_PP_CAT(++m_p, n) \ 82 //! 83 84 #ifndef BOOST_NO_RVALUE_REFERENCES 85 86 #if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) 87 88 #define BOOST_INTERPROCESS_AUX_PARAM_DEFINE(z, n, data) \ 89 BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n); \ 90 //! 91 92 #else 93 94 #define BOOST_INTERPROCESS_AUX_PARAM_DEFINE(z, n, data) \ 95 BOOST_PP_CAT(P, n) && BOOST_PP_CAT(m_p, n); \ 96 //! 97 98 #endif //defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) 99 100 101 #else 102 #define BOOST_INTERPROCESS_AUX_PARAM_DEFINE(z, n, data) \ 103 BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n); \ 104 //! 105 #endif 106 107 #define BOOST_INTERPROCESS_PP_PARAM_FORWARD(z, n, data) \ 108 ::boost::interprocess::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ) \ 109 //! 110 111 #if !defined(BOOST_NO_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) 112 113 #include <boost/interprocess/containers/container/detail/stored_ref.hpp> 114 115 #define BOOST_INTERPROCESS_PP_MEMBER_FORWARD(z, n, data) \ 116 ::boost::container::containers_detail::stored_ref< BOOST_PP_CAT(P, n) >::forward( BOOST_PP_CAT(m_p, n) ) \ 117 //! 118 119 #else 120 121 #define BOOST_INTERPROCESS_PP_MEMBER_FORWARD(z, n, data) \ 122 ::boost::interprocess::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(m_p, n) ) \ 123 //! 124 125 #endif //!defined(BOOST_NO_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) 126 127 #define BOOST_INTERPROCESS_PP_MEMBER_IT_FORWARD(z, n, data) \ 128 BOOST_PP_CAT(*m_p, n) \ 129 //! 130 131 #include <boost/interprocess/detail/config_end.hpp> 132 133 #else 134 #ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING 135 #error "This file is not needed when perfect forwarding is available" 136 #endif 137 #endif //#ifndef BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP 138