is_final_test.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright (c) 2014 Agustin Berge
  2. //
  3. // Use, modification and distribution are subject to the
  4. // Boost Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #ifdef TEST_STD
  7. # include <type_traits>
  8. #else
  9. # include <boost/type_traits/is_final.hpp>
  10. #endif
  11. #include "test.hpp"
  12. #include "check_integral_constant.hpp"
  13. #include <iostream>
  14. #if !defined(BOOST_NO_CXX11_FINAL)
  15. template <class T>
  16. struct final_template final
  17. {};
  18. #endif
  19. template <class T>
  20. struct non_final_template
  21. {};
  22. TT_TEST_BEGIN(is_final)
  23. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<int>::value, false);
  24. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<const int>::value, false);
  25. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<volatile int>::value, false);
  26. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<int*>::value, false);
  27. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<int* const>::value, false);
  28. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<int[2]>::value, false);
  29. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<int&>::value, false);
  30. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  31. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<int&&>::value, false);
  32. #endif
  33. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<mf4>::value, false);
  34. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<f1>::value, false);
  35. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<enum_UDT>::value, false);
  36. #if !defined(BOOST_NO_CXX11_FINAL)
  37. //
  38. // These are "soft" checks: since we cannot implement this trait
  39. // ourselves and instead rely on the compiler.
  40. //
  41. # ifndef BOOST_IS_FINAL
  42. BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_final<final_UDT>::value, true, false);
  43. BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_final<final_UDT const>::value, true, false);
  44. BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_final<final_template<int> >::value, true, false);
  45. BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_final<final_template<int> const>::value, true, false);
  46. # else
  47. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<final_UDT>::value, true);
  48. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<final_UDT const>::value, true);
  49. # if !BOOST_WORKAROUND(BOOST_MSVC, <= 1800)
  50. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<final_template<int> >::value, true);
  51. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<final_template<int> const>::value, true);
  52. # endif
  53. # endif
  54. #else
  55. std::cout <<
  56. "\n<note>\n"
  57. "This compiler version does not provide support for is_final on\n"
  58. "final types.n"
  59. "</note>\n";
  60. #endif
  61. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<UDT>::value, false);
  62. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<UDT const>::value, false);
  63. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<UDT volatile>::value, false);
  64. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<empty_UDT>::value, false);
  65. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<std::iostream>::value, false);
  66. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<UDT*>::value, false);
  67. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<UDT[2]>::value, false);
  68. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<UDT&>::value, false);
  69. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<void>::value, false);
  70. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<test_abc1>::value, false);
  71. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<foo0_t>::value, false);
  72. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<foo1_t>::value, false);
  73. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<foo2_t>::value, false);
  74. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<foo3_t>::value, false);
  75. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<foo4_t>::value, false);
  76. BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_final<non_final_template<int> >::value, false);
  77. TT_TEST_END