no_perfect_forwarding_begin.hpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright David Abrahams, Daniel Wallin 2003.
  2. // Copyright Cromwell D. Enage 2017.
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // No include guard. This file is intended for multiple inclusion.
  7. #define BOOST_PARAMETER_right_angle(z, n, _) >
  8. /**/
  9. #define BOOST_PARAMETER_satisfies_end(z, n, false_t) ,false_t>
  10. /**/
  11. #include <boost/preprocessor/seq/elem.hpp>
  12. #include <boost/preprocessor/cat.hpp>
  13. // Generates:
  14. //
  15. // make<
  16. // parameter_spec##0, argument_type##0
  17. // , make<
  18. // parameter_spec##1, argument_type##1
  19. // , ... boost::mpl::identity<boost::parameter::aux::empty_arg_list>
  20. // ...>
  21. // >
  22. #define BOOST_PARAMETER_make_arg_list(z, n, names) \
  23. BOOST_PP_SEQ_ELEM(0, names)< \
  24. BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1, names), n), \
  25. BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, names), n),
  26. /**/
  27. #include <boost/parameter/aux_/void.hpp>
  28. #include <boost/mpl/identity.hpp>
  29. #include <boost/preprocessor/repetition/repeat.hpp>
  30. #define BOOST_PARAMETER_build_arg_list(n, make, param_spec, arg_type) \
  31. BOOST_PP_REPEAT( \
  32. n, BOOST_PARAMETER_make_arg_list, (make)(param_spec)(arg_type) \
  33. ) \
  34. ::boost::mpl::identity< ::boost::parameter::void_> \
  35. BOOST_PP_REPEAT(n, BOOST_PARAMETER_right_angle, _)
  36. /**/
  37. #define BOOST_PARAMETER_make_deduced_list(z, n, names) \
  38. BOOST_PP_SEQ_ELEM(0, names)<BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1, names), n),
  39. /**/
  40. #define BOOST_PARAMETER_build_deduced_list(n, make, parameter_spec) \
  41. BOOST_PP_REPEAT( \
  42. n, BOOST_PARAMETER_make_deduced_list, (make)(parameter_spec) \
  43. ) \
  44. ::boost::mpl::identity< ::boost::parameter::void_> \
  45. BOOST_PP_REPEAT(n, BOOST_PARAMETER_right_angle, _)
  46. /**/
  47. #define BOOST_PARAMETER_forward_typedef(z, n, names) \
  48. typedef BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(0, names), n) \
  49. BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1, names), n);
  50. /**/
  51. #define BOOST_PARAMETER_template_args(z, n, prefix) \
  52. typename BOOST_PP_CAT(prefix, n) = ::boost::parameter::void_
  53. /**/
  54. #include <boost/mpl/pair.hpp>
  55. #if (0 < BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY)
  56. #include <boost/parameter/aux_/pack/item.hpp>
  57. #include <boost/preprocessor/control/iif.hpp>
  58. #define BOOST_PARAMETER_make_arg_items_R(r, prefix, i, elem) \
  59. ::boost::parameter::aux::item<BOOST_PP_CAT(prefix, i), \
  60. BOOST_PP_CAT(A, i) BOOST_PP_IIF(elem, &, const&),
  61. /**/
  62. #include <boost/parameter/aux_/pack/make_arg_list.hpp>
  63. #include <boost/parameter/aux_/pack/tag_keyword_arg.hpp>
  64. #include <boost/preprocessor/seq/for_each_i.hpp>
  65. #include <boost/preprocessor/seq/size.hpp>
  66. #define BOOST_PARAMETER_function_call_arg_list_R(r, seq) \
  67. ::boost::parameter::aux::make_arg_list< \
  68. BOOST_PP_SEQ_FOR_EACH_I_R( \
  69. r, BOOST_PARAMETER_make_arg_items_R, PS, seq \
  70. ) \
  71. ::boost::parameter::void_ \
  72. BOOST_PP_REPEAT( \
  73. BOOST_PP_SEQ_SIZE(seq), BOOST_PARAMETER_right_angle, _ \
  74. ) \
  75. , deduced_list \
  76. , ::boost::parameter::aux::tag_keyword_arg \
  77. >
  78. /**/
  79. #include <boost/preprocessor/arithmetic/sub.hpp>
  80. #define BOOST_PARAMETER_function_call_arg_pack_init(z, n, limit) \
  81. BOOST_PP_CAT(a, BOOST_PP_SUB(limit, n))
  82. /**/
  83. #include <boost/parameter/aux_/preprocessor/binary_seq_to_args.hpp>
  84. #include <boost/preprocessor/arithmetic/dec.hpp>
  85. #include <boost/preprocessor/facilities/intercept.hpp>
  86. #include <boost/preprocessor/repetition/enum.hpp>
  87. #include <boost/preprocessor/repetition/enum_params.hpp>
  88. #include <boost/preprocessor/repetition/enum_binary_params.hpp>
  89. #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
  90. #include <boost/preprocessor/seq/seq.hpp>
  91. #define BOOST_PARAMETER_function_call_op_overload_R(r, seq) \
  92. template < \
  93. BOOST_PP_ENUM_PARAMS( \
  94. BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)) \
  95. , typename A \
  96. ) \
  97. > \
  98. inline typename ::boost::mpl::first< \
  99. typename BOOST_PARAMETER_function_call_arg_list_R( \
  100. r, BOOST_PP_SEQ_TAIL(seq) \
  101. )::type \
  102. >::type \
  103. operator()( \
  104. BOOST_PARAMETER_AUX_PP_BINARY_SEQ_TO_ARGS( \
  105. BOOST_PP_SEQ_TAIL(seq), (A)(a) \
  106. ) \
  107. ) const \
  108. { \
  109. typedef typename BOOST_PARAMETER_function_call_arg_list_R( \
  110. r, BOOST_PP_SEQ_TAIL(seq) \
  111. )::type result; \
  112. typedef typename ::boost::mpl::first<result>::type result_type; \
  113. typedef typename ::boost::mpl::second<result>::type error; \
  114. error(); \
  115. return result_type( \
  116. BOOST_PP_ENUM( \
  117. BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)) \
  118. , BOOST_PARAMETER_function_call_arg_pack_init \
  119. , BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq))) \
  120. ) \
  121. BOOST_PP_ENUM_TRAILING_PARAMS( \
  122. BOOST_PP_SUB( \
  123. BOOST_PARAMETER_COMPOSE_MAX_ARITY \
  124. , BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)) \
  125. ) \
  126. , ::boost::parameter::aux::void_reference() BOOST_PP_INTERCEPT \
  127. ) \
  128. ); \
  129. }
  130. /**/
  131. #endif // exponential overloads
  132. #include <boost/parameter/aux_/pack/satisfies.hpp>
  133. #include <boost/mpl/eval_if.hpp>
  134. #define BOOST_PARAMETER_satisfies_begin(z, n, prefix) \
  135. ::boost::mpl::eval_if< \
  136. ::boost::parameter::aux::satisfies_requirements_of< \
  137. typename ::boost::mpl::first<ArgumentPackAndError>::type \
  138. , BOOST_PP_CAT(prefix, n) \
  139. >,
  140. /**/