any_bind_type.hpp 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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_ANY_BIND_TYPE_HPP_
  7. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_TYPE_HPP_
  8. #include <boost/local_function/detail/preprocessor/keyword/const_bind.hpp>
  9. #include <boost/local_function/detail/preprocessor/keyword/this.hpp>
  10. #include <boost/preprocessor/cat.hpp>
  11. #include <boost/preprocessor/control/iif.hpp>
  12. #include <boost/preprocessor/facilities/empty.hpp>
  13. #include <boost/preprocessor/facilities/expand.hpp>
  14. #include <boost/preprocessor/tuple/eat.hpp>
  15. #include <boost/preprocessor/tuple/rem.hpp>
  16. #include <boost/preprocessor/detail/is_unary.hpp>
  17. // PRIVATE //
  18. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE_(sign) \
  19. /* using PP_EXPAND here does not work on MSVC */ \
  20. BOOST_PP_TUPLE_REM(1) \
  21. BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT(sign) \
  22. BOOST_PP_EMPTY /* always trail EMPTY because bind type is optional */
  23. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE_( \
  24. sign) \
  25. /* using PP_EXPAND here does not work on MSVC */ \
  26. BOOST_PP_TUPLE_EAT(1) \
  27. BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT(sign)
  28. #define this_BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_REMOVE_THIS_ \
  29. /* must expand to nothing */
  30. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE_(sign) \
  31. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE( \
  32. /* can't use `THISUNDERSCIRE_REMOVE_BACK` because `sign` contains */ \
  33. /* multiple tokens (and not just one token) so */ \
  34. /* `IS_THISUNDERSCORE_BACK` does not work (but we know `sign` ends */ \
  35. /* with this_ if we here so we can manually force the removal using */ \
  36. BOOST_PP_CAT(sign, \
  37. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_REMOVE_THIS_) \
  38. ) \
  39. /* do not append PP_EMPTY because ANY_BIND_WITH_TYPE macro above */ \
  40. /* already appends it */
  41. // PUBLIC //
  42. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE(sign) \
  43. BOOST_PP_IS_UNARY( \
  44. BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT( \
  45. sign))
  46. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE(sign) \
  47. BOOST_PP_IIF( \
  48. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE( \
  49. sign),\
  50. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITH_TYPE_ \
  51. , \
  52. BOOST_PP_EMPTY \
  53. BOOST_PP_TUPLE_EAT(1) \
  54. )(sign)
  55. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE( \
  56. sign) \
  57. BOOST_PP_IIF( \
  58. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE( \
  59. sign),\
  60. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE_ \
  61. , \
  62. BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_CONST_BIND_REMOVE_FRONT \
  63. )(sign)
  64. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE(sign) \
  65. BOOST_PP_IIF( \
  66. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_HAS_TYPE( \
  67. sign),\
  68. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_THIS_TYPE_ \
  69. , \
  70. BOOST_PP_EMPTY \
  71. BOOST_PP_TUPLE_EAT(1) \
  72. )(sign)
  73. #endif // #include guard