1 2 // Copyright (C) 2009-2012 Lorenzo Caminiti 3 // Distributed under the Boost Software License, Version 1.0 4 // (see accompanying file LICENSE_1_0.txt or a copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 // Home at http://www.boost.org/libs/local_function 7 8 #ifndef BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_TYPE_HPP_ 9 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_TYPE_HPP_ 10 11 #include <boost/local_function/detail/preprocessor/keyword/const_bind.hpp> 12 #include <boost/local_function/detail/preprocessor/keyword/this.hpp> 13 #include <boost/preprocessor/cat.hpp> 14 #include <boost/preprocessor/control/iif.hpp> 15 #include <boost/preprocessor/facilities/empty.hpp> 16 #include <boost/preprocessor/facilities/expand.hpp> 17 #include <boost/preprocessor/tuple/eat.hpp> 18 #include <boost/preprocessor/tuple/rem.hpp> 19 #include <boost/preprocessor/detail/is_unary.hpp> 20 21 // PRIVATE // 22 23 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE_(sign) \ 24 /* using PP_EXPAND here does not work on MSVC */ \ 25 BOOST_PP_TUPLE_REM(1) \ 26 BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT(sign) \ 27 BOOST_PP_EMPTY /* always trail EMPTY because bind type is optional */ 28 29 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE_( \ 30 sign) \ 31 /* using PP_EXPAND here does not work on MSVC */ \ 32 BOOST_PP_TUPLE_EAT(1) \ 33 BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT(sign) 34 35 #define this_BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_REMOVE_THIS_ \ 36 /* must expand to nothing */ 37 38 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE_(sign) \ 39 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE( \ 40 /* can't use `THISUNDERSCIRE_REMOVE_BACK` because `sign` contains */ \ 41 /* multiple tokens (and not just one token) so */ \ 42 /* `IS_THISUNDERSCORE_BACK` does not work (but we know `sign` ends */ \ 43 /* with this_ if we here so we can manually force the removal using */ \ 44 BOOST_PP_CAT(sign, \ 45 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_REMOVE_THIS_) \ 46 ) \ 47 /* do not append PP_EMPTY because ANY_BIND_WITH_TYPE macro above */ \ 48 /* already appends it */ 49 50 // PUBLIC // 51 52 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE(sign) \ 53 BOOST_PP_IS_UNARY( \ 54 BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT( \ 55 sign)) 56 57 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE(sign) \ 58 BOOST_PP_IIF( \ 59 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE( \ 60 sign),\ 61 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE_ \ 62 , \ 63 BOOST_PP_EMPTY \ 64 BOOST_PP_TUPLE_EAT(1) \ 65 )(sign) 66 67 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE( \ 68 sign) \ 69 BOOST_PP_IIF( \ 70 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE( \ 71 sign),\ 72 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE_ \ 73 , \ 74 BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT \ 75 )(sign) 76 77 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE(sign) \ 78 BOOST_PP_IIF( \ 79 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE( \ 80 sign),\ 81 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE_ \ 82 , \ 83 BOOST_PP_EMPTY \ 84 BOOST_PP_TUPLE_EAT(1) \ 85 )(sign) 86 87 #endif // #include guard 88 89