sign.hpp 6.5 KB

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