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