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_HPP_ 9 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_HPP_ 10 11 #include <boost/local_function/aux_/preprocessor/traits/decl_sign_/validate.hpp> 12 #include <boost/local_function/aux_/preprocessor/traits/decl_sign_/any_bind_type.hpp> 13 #include <boost/local_function/aux_/preprocessor/traits/decl_/nil.hpp> 14 #include <boost/local_function/aux_/preprocessor/traits/decl_/set_error.hpp> 15 #include <boost/local_function/aux_/preprocessor/traits/decl_/validate.hpp> 16 #include <boost/local_function/aux_/preprocessor/traits/decl_/append.hpp> 17 #include <boost/local_function/detail/preprocessor/keyword/const_bind.hpp> 18 #include <boost/local_function/detail/preprocessor/keyword/bind.hpp> 19 #include <boost/local_function/detail/preprocessor/keyword/return.hpp> 20 #include <boost/local_function/detail/preprocessor/keyword/default.hpp> 21 #include <boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp> 22 #include <boost/preprocessor/control/iif.hpp> 23 #include <boost/preprocessor/facilities/is_empty.hpp> 24 #include <boost/preprocessor/list/fold_left.hpp> 25 26 // PRIVATE // 27 28 // Parse const binds. 29 30 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_THIS_( \ 31 decl_traits, sign) \ 32 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_CONST_BIND_THIS_TYPE( \ 33 decl_traits, \ 34 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE( \ 35 sign)) 36 37 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_VAR_( \ 38 decl_traits, sign) \ 39 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_CONST_BIND(decl_traits, \ 40 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE(\ 41 sign), \ 42 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE( \ 43 sign)) 44 45 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_( \ 46 decl_traits, sign) \ 47 /* check from back because non `this` bounds might have `&` in front */ \ 48 BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK(\ 49 /* remove all leading symbols `[const] bind [(type)] ...` */ \ 50 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE(\ 51 sign)),\ 52 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_THIS_ \ 53 , \ 54 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_VAR_ \ 55 )(decl_traits, sign) 56 57 // Parse binds. 58 59 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_THIS_( \ 60 decl_traits, sign) \ 61 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_BIND_THIS_TYPE(decl_traits, \ 62 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE( \ 63 sign)) 64 65 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_VAR_( \ 66 decl_traits, sign) \ 67 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_BIND(decl_traits, \ 68 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE(\ 69 sign), \ 70 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE( \ 71 sign)) 72 73 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_( \ 74 decl_traits, sign) \ 75 /* check from back because non `this` bounds might have `&` in front */ \ 76 BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK(\ 77 /* remove all leading symbols `[const] bind [(type)] ...` */ \ 78 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE(\ 79 sign)), \ 80 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_THIS_ \ 81 , \ 82 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_VAR_ \ 83 )(decl_traits, sign) 84 85 // Parse all elements. 86 87 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_( \ 88 s, decl_traits, sign) \ 89 BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_IS_RETURN_FRONT(sign), \ 90 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_RETURN \ 91 , BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_IS_BIND_FRONT(sign), \ 92 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_ \ 93 , BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_IS_CONST_BIND_FRONT( \ 94 sign), \ 95 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_ \ 96 , BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT( \ 97 sign), \ 98 /* elem is `default ...` where leading default is kept because */ \ 99 /* default value might not be alphanumeric (so it fails later CAT */ \ 100 /* for checks), leading default will be removed later when getting */ \ 101 /* the default value */ \ 102 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT \ 103 , /* else, it is a function parameter */ \ 104 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM \ 105 ))))(decl_traits, sign) 106 107 // Parse params after following precondition has been validated by caller. 108 // Precondition: If list contains a default param value `..., default, ...`, 109 // the default value element is never 1st (it always has a previous elem) and 110 // its previous element is a unbind param (no const-bind and no bind). 111 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID(sign) \ 112 BOOST_PP_LIST_FOLD_LEFT( \ 113 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID_, \ 114 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_NIL, sign) 115 116 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_OK_(sign, unused) \ 117 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_VALIDATE( \ 118 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALID(sign)) 119 120 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ERR_(unused, error) \ 121 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SET_ERROR( \ 122 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_NIL, error) 123 124 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_(sign, defaults_error) \ 125 BOOST_PP_IIF(BOOST_PP_IS_EMPTY(defaults_error (/* expand EMPTY */)), \ 126 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_OK_ \ 127 , \ 128 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ERR_ \ 129 )(sign, defaults_error) 130 131 // PUBLIC // 132 133 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN(sign) \ 134 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_(sign, \ 135 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_VALIDATE(sign)) 136 137 #endif // #include guard 138 139