/* Copyright (c) 2016 Barrett Adair Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) HEADER GUARDS INTENTIONALLY OMITTED DO NOT INCLUDE THIS HEADER DIRECTLY macros used: BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS - the function-level qualifiers for the current inclusion (combinations of `const` `volatile` `&` `&&`, or nothing) BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE - the transaction_safe specifier for the current include (`transaction_safe` or nothing) BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE - `std::true_type` or `std::false_type`, tied on whether BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE is `transaction_safe` BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER - `transaction_safe` when BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE is enabled, otherwise nothing BOOST_CLBL_TRTS_NOEXCEPT_SPEC - the noexcept specifier for the current include (`noexcept` or nothing) BOOST_CLBL_TRTS_IS_NOEXCEPT - `std::true_type` or `std::false_type`, tied on whether BOOST_CLBL_TRTS_NOEXCEPT_SPEC is `noexcept` BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER - `noexcept` if BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES is defined, otherwise nothing */ template struct function : default_callable_traits { static constexpr bool value = true; using traits = function; using return_type = Return; using arg_types = std::tuple; using non_invoke_arg_types = arg_types; using type = Return(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using function_type = Return(Args...); using qualified_function_type = Return(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using remove_varargs = type; using add_varargs = Return (Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT; using remove_noexcept = Return(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE; using add_noexcept = Return(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER; using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE; using remove_transaction_safe = Return(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using add_transaction_safe = Return(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using qualifiers = default_callable_traits; template using set_qualifiers = set_function_qualifiers; #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS using add_member_lvalue_reference = abominable_functions_not_supported_on_this_compiler; using add_member_rvalue_reference = abominable_functions_not_supported_on_this_compiler; using add_member_const = abominable_functions_not_supported_on_this_compiler; using add_member_volatile = abominable_functions_not_supported_on_this_compiler; using add_member_cv = abominable_functions_not_supported_on_this_compiler; #else using add_member_lvalue_reference = set_qualifiers< collapse_flags::value>; using add_member_rvalue_reference = set_qualifiers< collapse_flags::value>; using add_member_const = set_qualifiers; using add_member_volatile = set_qualifiers; using add_member_cv = set_qualifiers; #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS using remove_member_reference = set_qualifiers; using remove_member_const = set_qualifiers< qualifiers::ref_flags | remove_const_flag::value>; using remove_member_volatile = set_qualifiers< qualifiers::ref_flags | remove_volatile_flag::value>; using remove_member_cv = set_qualifiers; template using apply_member_pointer = add_member_pointer; template using apply_return = NewReturn(Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; template class Container> using expand_args = Container; using is_member_pointer = std::false_type; }; template struct function : default_callable_traits { static constexpr bool value = true; using has_varargs = std::true_type; using traits = function; using return_type = Return; using arg_types = std::tuple; using type = Return (Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using function_type = Return(Args..., ...); using qualified_function_type = Return(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using remove_varargs = Return (Args...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using add_varargs = type; using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT; using remove_noexcept = Return(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE; using add_noexcept = Return(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER; using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE; using remove_transaction_safe = Return(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using add_transaction_safe = Return(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER BOOST_CLBL_TRTS_NOEXCEPT_SPEC; using qualifiers = default_callable_traits; template using set_qualifiers = set_varargs_function_qualifiers; #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS using add_member_lvalue_reference = abominable_functions_not_supported_on_this_compiler; using add_member_rvalue_reference = abominable_functions_not_supported_on_this_compiler; using add_member_const = abominable_functions_not_supported_on_this_compiler; using add_member_volatile = abominable_functions_not_supported_on_this_compiler; using add_member_cv = abominable_functions_not_supported_on_this_compiler; #else using add_member_lvalue_reference = set_qualifiers< collapse_flags::value>; using add_member_rvalue_reference = set_qualifiers< collapse_flags::value>; using add_member_const = set_qualifiers; using add_member_volatile = set_qualifiers; using add_member_cv = set_qualifiers; #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS using remove_member_reference = set_qualifiers; using remove_member_const = set_qualifiers< qualifiers::ref_flags | remove_const_flag::value>; using remove_member_volatile = set_qualifiers< qualifiers::ref_flags | remove_volatile_flag::value>; using remove_member_cv = set_qualifiers; template using apply_member_pointer = Return( BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC U::*)(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; template using apply_return = NewReturn(Args..., ...) BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE BOOST_CLBL_TRTS_NOEXCEPT_SPEC; template class Container> using expand_args = Container; using is_member_pointer = std::false_type; };