function_3.hpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. Copyright (c) 2016 Barrett Adair
  3. Distributed under the Boost Software License, Version 1.0.
  4. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  5. HEADER GUARDS INTENTIONALLY OMITTED
  6. DO NOT INCLUDE THIS HEADER DIRECTLY
  7. macros used:
  8. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS - the function-level qualifiers for the
  9. current inclusion (combinations of `const` `volatile` `&` `&&`, or nothing)
  10. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE - the transaction_safe specifier for
  11. the current include (`transaction_safe` or nothing)
  12. BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE - `std::true_type` or `std::false_type`,
  13. tied on whether BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE is `transaction_safe`
  14. BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER - `transaction_safe` when
  15. BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE is enabled, otherwise nothing
  16. BOOST_CLBL_TRTS_NOEXCEPT_SPEC - the noexcept specifier for
  17. the current include (`noexcept` or nothing)
  18. BOOST_CLBL_TRTS_IS_NOEXCEPT - `std::true_type` or `std::false_type`,
  19. tied on whether BOOST_CLBL_TRTS_NOEXCEPT_SPEC is `noexcept`
  20. BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER - `noexcept` if
  21. BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES is defined, otherwise nothing
  22. */
  23. template<typename Return, typename... Args>
  24. struct function<Return(Args...)
  25. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  26. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  27. BOOST_CLBL_TRTS_NOEXCEPT_SPEC>
  28. : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> {
  29. static constexpr bool value = true;
  30. using traits = function;
  31. using return_type = Return;
  32. using arg_types = std::tuple<Args...>;
  33. using non_invoke_arg_types = arg_types;
  34. using type = Return(Args...)
  35. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  36. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  37. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  38. using function_type = Return(Args...);
  39. using qualified_function_type = Return(Args...)
  40. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  41. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  42. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  43. using remove_varargs = type;
  44. using add_varargs = Return (Args..., ...)
  45. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  46. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  47. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  48. using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT;
  49. using remove_noexcept = Return(Args...)
  50. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  51. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE;
  52. using add_noexcept = Return(Args...)
  53. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  54. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  55. BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER;
  56. using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE;
  57. using remove_transaction_safe = Return(Args...)
  58. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  59. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  60. using add_transaction_safe = Return(Args...)
  61. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  62. BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER
  63. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  64. using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>;
  65. template<qualifier_flags Flags>
  66. using set_qualifiers = set_function_qualifiers<Flags, is_transaction_safe::value,
  67. is_noexcept::value, Return, Args...>;
  68. #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
  69. using add_member_lvalue_reference = abominable_functions_not_supported_on_this_compiler;
  70. using add_member_rvalue_reference = abominable_functions_not_supported_on_this_compiler;
  71. using add_member_const = abominable_functions_not_supported_on_this_compiler;
  72. using add_member_volatile = abominable_functions_not_supported_on_this_compiler;
  73. using add_member_cv = abominable_functions_not_supported_on_this_compiler;
  74. #else
  75. using add_member_lvalue_reference = set_qualifiers<
  76. collapse_flags<qualifiers::q_flags, lref_>::value>;
  77. using add_member_rvalue_reference = set_qualifiers<
  78. collapse_flags<qualifiers::q_flags, rref_>::value>;
  79. using add_member_const = set_qualifiers<qualifiers::q_flags | const_>;
  80. using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>;
  81. using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>;
  82. #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
  83. using remove_member_reference = set_qualifiers<qualifiers::cv_flags>;
  84. using remove_member_const = set_qualifiers<
  85. qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>;
  86. using remove_member_volatile = set_qualifiers<
  87. qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>;
  88. using remove_member_cv = set_qualifiers<qualifiers::ref_flags>;
  89. template<typename U>
  90. using apply_member_pointer = add_member_pointer<type, U>;
  91. template<typename NewReturn>
  92. using apply_return = NewReturn(Args...)
  93. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  94. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  95. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  96. template<template<class...> class Container>
  97. using expand_args = Container<Args...>;
  98. using is_member_pointer = std::false_type;
  99. };
  100. template<typename Return, typename... Args>
  101. struct function<Return (Args..., ...)
  102. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  103. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  104. BOOST_CLBL_TRTS_NOEXCEPT_SPEC>
  105. : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> {
  106. static constexpr bool value = true;
  107. using has_varargs = std::true_type;
  108. using traits = function;
  109. using return_type = Return;
  110. using arg_types = std::tuple<Args...>;
  111. using type = Return (Args..., ...)
  112. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  113. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  114. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  115. using function_type = Return(Args..., ...);
  116. using qualified_function_type = Return(Args..., ...)
  117. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  118. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  119. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  120. using remove_varargs = Return (Args...)
  121. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  122. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  123. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  124. using add_varargs = type;
  125. using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT;
  126. using remove_noexcept = Return(Args..., ...)
  127. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  128. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE;
  129. using add_noexcept = Return(Args..., ...)
  130. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  131. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  132. BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER;
  133. using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE;
  134. using remove_transaction_safe = Return(Args..., ...)
  135. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  136. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  137. using add_transaction_safe = Return(Args..., ...)
  138. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  139. BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER
  140. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  141. using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>;
  142. template<qualifier_flags Flags>
  143. using set_qualifiers = set_varargs_function_qualifiers<Flags, is_transaction_safe::value,
  144. is_noexcept::value, Return, Args...>;
  145. #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
  146. using add_member_lvalue_reference = abominable_functions_not_supported_on_this_compiler;
  147. using add_member_rvalue_reference = abominable_functions_not_supported_on_this_compiler;
  148. using add_member_const = abominable_functions_not_supported_on_this_compiler;
  149. using add_member_volatile = abominable_functions_not_supported_on_this_compiler;
  150. using add_member_cv = abominable_functions_not_supported_on_this_compiler;
  151. #else
  152. using add_member_lvalue_reference = set_qualifiers<
  153. collapse_flags<qualifiers::q_flags, lref_>::value>;
  154. using add_member_rvalue_reference = set_qualifiers<
  155. collapse_flags<qualifiers::q_flags, rref_>::value>;
  156. using add_member_const = set_qualifiers<qualifiers::q_flags | const_>;
  157. using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>;
  158. using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>;
  159. #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
  160. using remove_member_reference = set_qualifiers<qualifiers::cv_flags>;
  161. using remove_member_const = set_qualifiers<
  162. qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>;
  163. using remove_member_volatile = set_qualifiers<
  164. qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>;
  165. using remove_member_cv = set_qualifiers<qualifiers::ref_flags>;
  166. template<typename U>
  167. using apply_member_pointer =
  168. Return( BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC U::*)(Args..., ...)
  169. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  170. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  171. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  172. template<typename NewReturn>
  173. using apply_return = NewReturn(Args..., ...)
  174. BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
  175. BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
  176. BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
  177. template<template<class...> class Container>
  178. using expand_args = Container<Args...>;
  179. using is_member_pointer = std::false_type;
  180. };