is_lvalue_reference_member.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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 <utility>
  9. #include <boost/callable_traits/is_lvalue_reference_member.hpp>
  10. #include "test.hpp"
  11. #ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS
  12. int main(){ return 0; }
  13. #else
  14. struct foo {};
  15. template<typename T>
  16. void assert_lvalue_qualified() {
  17. CT_ASSERT( is_lvalue_reference_member<T>());
  18. }
  19. template<typename T>
  20. void assert_not_lvalue_qualified() {
  21. CT_ASSERT(! is_lvalue_reference_member<T>());
  22. }
  23. int main() {
  24. {
  25. using f = void(foo::*)();
  26. using l = void(foo::*)() &;
  27. using r = void(foo::*)() && ;
  28. using c = void(foo::*)() const;
  29. using cl = void(foo::*)() const &;
  30. using cr = void(foo::*)() const &&;
  31. using v = void(foo::*)() volatile;
  32. using vl = void(foo::*)() volatile &;
  33. using vr = void(foo::*)() volatile &&;
  34. using cv = void(foo::*)() const volatile;
  35. using cvl = void(foo::*)() const volatile &;
  36. using cvr = void(foo::*)() const volatile &&;
  37. assert_not_lvalue_qualified<f>();
  38. assert_lvalue_qualified<l>();
  39. assert_not_lvalue_qualified<r>();
  40. assert_not_lvalue_qualified<c>();
  41. assert_lvalue_qualified<cl>();
  42. assert_not_lvalue_qualified<cr>();
  43. assert_not_lvalue_qualified<v>();
  44. assert_lvalue_qualified<vl>();
  45. assert_not_lvalue_qualified<vr>();
  46. assert_not_lvalue_qualified<cv>();
  47. assert_lvalue_qualified<cvl>();
  48. assert_not_lvalue_qualified<cvr>();
  49. }
  50. {
  51. struct f { int operator()() { return 0; } };
  52. struct l { int operator()() & { return 0; } };
  53. struct r { int operator()() && { return 0; } };
  54. struct c { int operator()() const { return 0; } };
  55. struct cl { int operator()() const & { return 0; } };
  56. struct cr { int operator()() const && { return 0; } };
  57. struct v { int operator()() volatile { return 0; } };
  58. struct vl { int operator()() volatile & { return 0; } };
  59. struct vr { int operator()() volatile && { return 0; } };
  60. struct cv { int operator()() const volatile { return 0; } };
  61. struct cvl { int operator()() const volatile & { return 0; } };
  62. struct cvr { int operator()() const volatile && { return 0; } };
  63. assert_not_lvalue_qualified<f>();
  64. assert_lvalue_qualified<l>();
  65. assert_not_lvalue_qualified<r>();
  66. assert_not_lvalue_qualified<c>();
  67. assert_lvalue_qualified<cl>();
  68. assert_not_lvalue_qualified<cr>();
  69. assert_not_lvalue_qualified<v>();
  70. assert_lvalue_qualified<vl>();
  71. assert_not_lvalue_qualified<vr>();
  72. assert_not_lvalue_qualified<cv>();
  73. assert_lvalue_qualified<cvl>();
  74. assert_not_lvalue_qualified<cvr>();
  75. }
  76. {
  77. using f = void();
  78. using l = void() &;
  79. using r = void() && ;
  80. using c = void() const;
  81. using cl = void() const &;
  82. using cr = void() const &&;
  83. using v = void() volatile;
  84. using vl = void() volatile &;
  85. using vr = void() volatile &&;
  86. using cv = void() const volatile;
  87. using cvl = void() const volatile &;
  88. using cvr = void() const volatile &&;
  89. CT_ASSERT(! is_lvalue_reference_member<f>());
  90. CT_ASSERT( is_lvalue_reference_member<l>());
  91. CT_ASSERT(! is_lvalue_reference_member<r>());
  92. CT_ASSERT(! is_lvalue_reference_member<c>());
  93. CT_ASSERT( is_lvalue_reference_member<cl>());
  94. CT_ASSERT(! is_lvalue_reference_member<cr>());
  95. CT_ASSERT(! is_lvalue_reference_member<v>());
  96. CT_ASSERT( is_lvalue_reference_member<vl>());
  97. CT_ASSERT(! is_lvalue_reference_member<vr>());
  98. CT_ASSERT(! is_lvalue_reference_member<cv>());
  99. CT_ASSERT( is_lvalue_reference_member<cvl>());
  100. CT_ASSERT(! is_lvalue_reference_member<cvr>());
  101. }
  102. using f_ptr = void(*)();
  103. assert_not_lvalue_qualified<f_ptr>();
  104. assert_not_lvalue_qualified<f_ptr foo::*>();
  105. assert_not_lvalue_qualified<int foo::*>();
  106. assert_not_lvalue_qualified<void(&)()>();
  107. }
  108. #endif //#ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS