1 /*
2 Copyright Barrett Adair 2016-2017
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt)
5 */
6 
7 #include <type_traits>
8 #include <functional>
9 #include <tuple>
10 #include <boost/callable_traits/add_member_lvalue_reference.hpp>
11 #include "test.hpp"
12 
13 #ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS
main()14 int main(){ return 0; }
15 #else
16 
17 struct foo{};
18 
main()19 int main() {
20 
21     {
22         using f   = void(foo::*)();
23         using l   = void(foo::*)() &;
24         using r   = void(foo::*)() &&;
25         using c   = void(foo::*)() const;
26         using cl  = void(foo::*)() const &;
27         using cr  = void(foo::*)() const &&;
28         using v   = void(foo::*)() volatile;
29         using vl  = void(foo::*)() volatile &;
30         using vr  = void(foo::*)() volatile &&;
31         using cv  = void(foo::*)() const volatile;
32         using cvl = void(foo::*)() const volatile &;
33         using cvr = void(foo::*)() const volatile &&;
34 
35         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, f)>{});
36         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, c)>{});
37         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
38         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
39         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cv)>{});
40         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, l)>{});
41         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, cl)>{});
42         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, vl)>{});
43         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cvl)>{});
44         CT_ASSERT(!std::is_same<r,    TRAIT(add_member_lvalue_reference, r)>{});
45         CT_ASSERT(!std::is_same<cr,   TRAIT(add_member_lvalue_reference, cr)>{});
46         CT_ASSERT(!std::is_same<vr,   TRAIT(add_member_lvalue_reference, vr)>{});
47         CT_ASSERT(!std::is_same<cvr,  TRAIT(add_member_lvalue_reference, cvr)>{});
48     }
49 
50     {
51         using f   = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...);
52         using l   = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) &;
53         using r   = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) &&;
54         using c   = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) const;
55         using cl  = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) const &;
56         using cr  = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) const &&;
57         using v   = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) volatile;
58         using vl  = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) volatile &;
59         using vr  = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) volatile &&;
60         using cv  = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) const volatile;
61         using cvl = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) const volatile &;
62         using cvr = void(BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC foo::*)(...) const volatile &&;
63 
64         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, f)>{});
65         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, c)>{});
66         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
67         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
68         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cv)>{});
69         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, l)>{});
70         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, cl)>{});
71         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, vl)>{});
72         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cvl)>{});
73         CT_ASSERT(!std::is_same<r,    TRAIT(add_member_lvalue_reference, r)>{});
74         CT_ASSERT(!std::is_same<cr,   TRAIT(add_member_lvalue_reference, cr)>{});
75         CT_ASSERT(!std::is_same<vr,   TRAIT(add_member_lvalue_reference, vr)>{});
76         CT_ASSERT(!std::is_same<cvr,  TRAIT(add_member_lvalue_reference, cvr)>{});
77     }
78 
79     {
80         using f   = void(...);
81         using l   = void(...) &;
82         using r   = void(...) &&;
83         using c   = void(...) const;
84         using cl  = void(...) const &;
85         using cr  = void(...) const &&;
86         using v   = void(...) volatile;
87         using vl  = void(...) volatile &;
88         using vr  = void(...) volatile &&;
89         using cv  = void(...) const volatile;
90         using cvl = void(...) const volatile &;
91         using cvr = void(...) const volatile &&;
92 
93         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, f)>{});
94         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, c)>{});
95         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
96         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
97         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cv)>{});
98         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, l)>{});
99         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, cl)>{});
100         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, vl)>{});
101         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cvl)>{});
102         CT_ASSERT(!std::is_same<r,    TRAIT(add_member_lvalue_reference, r)>{});
103         CT_ASSERT(!std::is_same<cr,   TRAIT(add_member_lvalue_reference, cr)>{});
104         CT_ASSERT(!std::is_same<vr,   TRAIT(add_member_lvalue_reference, vr)>{});
105         CT_ASSERT(!std::is_same<cvr,  TRAIT(add_member_lvalue_reference, cvr)>{});
106     }
107 
108     #ifdef BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE
109     {
110         using f   = void(...) transaction_safe;
111         using l   = void(...) & transaction_safe;
112         using r   = void(...) && transaction_safe;
113         using c   = void(...) const transaction_safe;
114         using cl  = void(...) const & transaction_safe;
115         using cr  = void(...) const && transaction_safe;
116         using v   = void(...) volatile transaction_safe;
117         using vl  = void(...) volatile & transaction_safe;
118         using vr  = void(...) volatile && transaction_safe;
119         using cv  = void(...) const volatile transaction_safe;
120         using cvl = void(...) const volatile & transaction_safe;
121         using cvr = void(...) const volatile && transaction_safe;
122 
123         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, f)>{});
124         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, c)>{});
125         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
126         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
127         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cv)>{});
128         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, l)>{});
129         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, cl)>{});
130         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, vl)>{});
131         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cvl)>{});
132         CT_ASSERT(!std::is_same<r,    TRAIT(add_member_lvalue_reference, r)>{});
133         CT_ASSERT(!std::is_same<cr,   TRAIT(add_member_lvalue_reference, cr)>{});
134         CT_ASSERT(!std::is_same<vr,   TRAIT(add_member_lvalue_reference, vr)>{});
135         CT_ASSERT(!std::is_same<cvr,  TRAIT(add_member_lvalue_reference, cvr)>{});
136 
137     }
138     #endif // #ifdef BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE
139 
140     #ifdef BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES
141     {
142         using f   = void(...) noexcept;
143         using l   = void(...) & noexcept;
144         using r   = void(...) && noexcept;
145         using c   = void(...) const noexcept;
146         using cl  = void(...) const & noexcept;
147         using cr  = void(...) const && noexcept;
148         using v   = void(...) volatile noexcept;
149         using vl  = void(...) volatile & noexcept;
150         using vr  = void(...) volatile && noexcept;
151         using cv  = void(...) const volatile noexcept;
152         using cvl = void(...) const volatile & noexcept;
153         using cvr = void(...) const volatile && noexcept;
154 
155         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, f)>{});
156         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, c)>{});
157         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
158         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
159         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cv)>{});
160         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, l)>{});
161         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, cl)>{});
162         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, vl)>{});
163         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cvl)>{});
164         CT_ASSERT(!std::is_same<r,    TRAIT(add_member_lvalue_reference, r)>{});
165         CT_ASSERT(!std::is_same<cr,   TRAIT(add_member_lvalue_reference, cr)>{});
166         CT_ASSERT(!std::is_same<vr,   TRAIT(add_member_lvalue_reference, vr)>{});
167         CT_ASSERT(!std::is_same<cvr,  TRAIT(add_member_lvalue_reference, cvr)>{});
168     }
169     #endif // #ifdef BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES
170 
171     #ifdef BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES
172     #ifdef BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE
173     {
174         using f   = void(...) transaction_safe noexcept;
175         using l   = void(...) & transaction_safe noexcept;
176         using r   = void(...) && transaction_safe noexcept;
177         using c   = void(...) const transaction_safe noexcept;
178         using cl  = void(...) const & transaction_safe noexcept;
179         using cr  = void(...) const && transaction_safe noexcept;
180         using v   = void(...) volatile transaction_safe noexcept;
181         using vl  = void(...) volatile & transaction_safe noexcept;
182         using vr  = void(...) volatile && transaction_safe noexcept;
183         using cv  = void(...) const volatile transaction_safe noexcept;
184         using cvl = void(...) const volatile & transaction_safe noexcept;
185         using cvr = void(...) const volatile && transaction_safe noexcept;
186 
187         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, f)>{});
188         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, c)>{});
189         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
190         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, v)>{});
191         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cv)>{});
192         CT_ASSERT(std::is_same<l,     TRAIT(add_member_lvalue_reference, l)>{});
193         CT_ASSERT(std::is_same<cl,    TRAIT(add_member_lvalue_reference, cl)>{});
194         CT_ASSERT(std::is_same<vl,    TRAIT(add_member_lvalue_reference, vl)>{});
195         CT_ASSERT(std::is_same<cvl,   TRAIT(add_member_lvalue_reference, cvl)>{});
196         CT_ASSERT(!std::is_same<r,    TRAIT(add_member_lvalue_reference, r)>{});
197         CT_ASSERT(!std::is_same<cr,   TRAIT(add_member_lvalue_reference, cr)>{});
198         CT_ASSERT(!std::is_same<vr,   TRAIT(add_member_lvalue_reference, vr)>{});
199         CT_ASSERT(!std::is_same<cvr,  TRAIT(add_member_lvalue_reference, cvr)>{});
200     }
201     #endif // #ifdef BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE
202     #endif // #ifdef BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES
203 }
204 
205 #endif //#ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS
206 
207