diff options
Diffstat (limited to 'boost/callable_traits/detail/unguarded/pmf_varargs_4.hpp')
-rw-r--r-- | boost/callable_traits/detail/unguarded/pmf_varargs_4.hpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/boost/callable_traits/detail/unguarded/pmf_varargs_4.hpp b/boost/callable_traits/detail/unguarded/pmf_varargs_4.hpp new file mode 100644 index 0000000000..ca33ebf96b --- /dev/null +++ b/boost/callable_traits/detail/unguarded/pmf_varargs_4.hpp @@ -0,0 +1,149 @@ +/* +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 + +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 T, typename... Args> +struct pmf<Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(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 = pmf; + + using return_type = Return; + + using type = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) + BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE + BOOST_CLBL_TRTS_NOEXCEPT_SPEC; + + using invoke_type = typename std::conditional< + std::is_rvalue_reference<T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>::value, + T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS, + typename std::add_lvalue_reference<T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>::type + >::type; + + using arg_types = std::tuple<invoke_type, Args...>; + using non_invoke_arg_types = std::tuple<Args...>; + + using function_object_signature = Return(Args..., ...); + + using function_type = Return(invoke_type, Args..., ...); + + using qualified_function_type = Return(Args..., ...) + BOOST_CLBL_TRTS_INCLUDE_ABOMINABLE_QUALIFIERS + BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE + BOOST_CLBL_TRTS_NOEXCEPT_SPEC; + + using remove_varargs = + Return(BOOST_CLBL_TRTS_CC T::*)(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(BOOST_CLBL_TRTS_CC T::*)(Args..., ...) + BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE; + + using add_noexcept = Return(BOOST_CLBL_TRTS_CC T::*)(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(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) + BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + BOOST_CLBL_TRTS_NOEXCEPT_SPEC; + + using add_transaction_safe = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) + BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS + BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER + BOOST_CLBL_TRTS_NOEXCEPT_SPEC; + + using class_type = T; + + using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>; + + template<qualifier_flags Flags> + using set_qualifiers = set_varargs_member_function_qualifiers< + Flags, is_transaction_safe::value, is_noexcept::value, + BOOST_CLBL_TRTS_CC_TAG, T, Return, Args...>; + + using remove_member_reference = set_qualifiers<qualifiers::cv_flags>; + + 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_>; + + 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_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(BOOST_CLBL_TRTS_VARARGS_CC T::*)(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<invoke_type, Args...>; + + using is_member_pointer = std::true_type; +}; |