123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- /*
- 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<typename Return, typename... Args>
- struct function<Return(Args...)
- BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
- BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
- BOOST_CLBL_TRTS_NOEXCEPT_SPEC>
- : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> {
-
- static constexpr bool value = true;
-
- using traits = function;
- using return_type = Return;
- using arg_types = std::tuple<Args...>;
- 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<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>;
-
- template<qualifier_flags Flags>
- using set_qualifiers = set_function_qualifiers<Flags, is_transaction_safe::value,
- is_noexcept::value, Return, Args...>;
-
- #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<qualifiers::q_flags, lref_>::value>;
- using add_member_rvalue_reference = set_qualifiers<
- collapse_flags<qualifiers::q_flags, rref_>::value>;
- using add_member_const = set_qualifiers<qualifiers::q_flags | const_>;
- using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>;
- using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>;
- #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
-
- using remove_member_reference = set_qualifiers<qualifiers::cv_flags>;
- using remove_member_const = set_qualifiers<
- qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>;
-
- using remove_member_volatile = set_qualifiers<
- qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>;
-
- using remove_member_cv = set_qualifiers<qualifiers::ref_flags>;
- template<typename U>
- using apply_member_pointer = add_member_pointer<type, U>;
-
- template<typename NewReturn>
- using apply_return = NewReturn(Args...)
- BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
- BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
- BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
-
- template<template<class...> class Container>
- using expand_args = Container<Args...>;
- using is_member_pointer = std::false_type;
- };
- template<typename Return, typename... Args>
- struct function<Return (Args..., ...)
- BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
- BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
- BOOST_CLBL_TRTS_NOEXCEPT_SPEC>
- : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> {
-
- static constexpr bool value = true;
-
- using has_varargs = std::true_type;
- using traits = function;
- using return_type = Return;
- using arg_types = std::tuple<Args...>;
- 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<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>;
-
- template<qualifier_flags Flags>
- using set_qualifiers = set_varargs_function_qualifiers<Flags, is_transaction_safe::value,
- is_noexcept::value, Return, Args...>;
-
- #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<qualifiers::q_flags, lref_>::value>;
-
- using add_member_rvalue_reference = set_qualifiers<
- collapse_flags<qualifiers::q_flags, rref_>::value>;
-
- using add_member_const = set_qualifiers<qualifiers::q_flags | const_>;
- using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>;
- using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>;
-
- #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
- using remove_member_reference = set_qualifiers<qualifiers::cv_flags>;
- using remove_member_const = set_qualifiers<
- qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>;
-
- using remove_member_volatile = set_qualifiers<
- qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>;
-
- using remove_member_cv = set_qualifiers<qualifiers::ref_flags>;
-
- template<typename U>
- 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<typename NewReturn>
- using apply_return = NewReturn(Args..., ...)
- BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
- BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
- BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
-
- template<template<class...> class Container>
- using expand_args = Container<Args...>;
-
- using is_member_pointer = std::false_type;
- };
|