add_member_lvalue_reference.cpp 11 KB

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