• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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