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 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS - the function-level qualifiers for the 11 current inclusion (combinations of `const` `volatile` `&` `&&`, or nothing) 12 13 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE - the transaction_safe specifier for 14 the current include (`transaction_safe` or nothing) 15 16 BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE - `std::true_type` or `std::false_type`, 17 tied on whether BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE is `transaction_safe` 18 19 BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER - `transaction_safe` when 20 BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE is enabled, otherwise nothing 21 22 BOOST_CLBL_TRTS_NOEXCEPT_SPEC - the noexcept specifier for 23 the current include (`noexcept` or nothing) 24 25 BOOST_CLBL_TRTS_IS_NOEXCEPT - `std::true_type` or `std::false_type`, 26 tied on whether BOOST_CLBL_TRTS_NOEXCEPT_SPEC is `noexcept` 27 28 BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER - `noexcept` if 29 BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES is defined, otherwise nothing 30 */ 31 32 template<typename Return, typename T, typename... Args> 33 struct pmf<Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) 34 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 35 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 36 BOOST_CLBL_TRTS_NOEXCEPT_SPEC> 37 : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> { 38 39 static constexpr bool value = true; 40 41 using has_varargs = std::true_type; 42 43 using traits = pmf; 44 45 using return_type = Return; 46 47 using type = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) 48 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 49 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 50 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 51 52 using invoke_type = typename std::conditional< 53 std::is_rvalue_reference<T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>::value, 54 T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS, 55 typename std::add_lvalue_reference<T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>::type 56 >::type; 57 58 using arg_types = std::tuple<invoke_type, Args...>; 59 using non_invoke_arg_types = std::tuple<Args...>; 60 61 using function_object_signature = Return(Args..., ...); 62 63 using function_type = Return(invoke_type, Args..., ...); 64 65 using qualified_function_type = Return(Args..., ...) 66 BOOST_CLBL_TRTS_INCLUDE_ABOMINABLE_QUALIFIERS 67 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 68 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 69 70 using remove_varargs = 71 Return(BOOST_CLBL_TRTS_CC T::*)(Args...) 72 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 73 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 74 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 75 76 using add_varargs = type; 77 78 using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT; 79 80 using remove_noexcept = Return(BOOST_CLBL_TRTS_CC T::*)(Args..., ...) 81 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 82 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE; 83 84 using add_noexcept = Return(BOOST_CLBL_TRTS_CC T::*)(Args..., ...) 85 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 86 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 87 BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER; 88 89 using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE; 90 91 using remove_transaction_safe = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) 92 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 93 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 94 95 using add_transaction_safe = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) 96 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 97 BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER 98 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 99 100 using class_type = T; 101 102 using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>; 103 104 template<qualifier_flags Flags> 105 using set_qualifiers = set_varargs_member_function_qualifiers< 106 Flags, is_transaction_safe::value, is_noexcept::value, 107 BOOST_CLBL_TRTS_CC_TAG, T, Return, Args...>; 108 109 using remove_member_reference = set_qualifiers<qualifiers::cv_flags>; 110 111 using add_member_lvalue_reference = set_qualifiers< 112 collapse_flags<qualifiers::q_flags, lref_>::value>; 113 114 using add_member_rvalue_reference = set_qualifiers< 115 collapse_flags<qualifiers::q_flags, rref_>::value>; 116 117 using add_member_const = set_qualifiers<qualifiers::q_flags | const_>; 118 119 using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>; 120 121 using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>; 122 123 using remove_member_const = set_qualifiers< 124 qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>; 125 126 using remove_member_volatile = set_qualifiers< 127 qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>; 128 129 using remove_member_cv = set_qualifiers<qualifiers::ref_flags>; 130 131 template<typename U> 132 using apply_member_pointer = 133 Return(BOOST_CLBL_TRTS_VARARGS_CC U::*)(Args..., ...) 134 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 135 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 136 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 137 138 template<typename NewReturn> 139 using apply_return = 140 NewReturn(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) 141 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS 142 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE 143 BOOST_CLBL_TRTS_NOEXCEPT_SPEC; 144 145 template<template<class...> class Container> 146 using expand_args = Container<invoke_type, Args...>; 147 148 using is_member_pointer = std::true_type; 149 }; 150