variant_eq_ne_cx.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright 2017, 2019 Peter Dimov
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. //
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. #include <boost/variant2/variant.hpp>
  8. using namespace boost::variant2;
  9. #if !defined(BOOST_MP11_HAS_CXX14_CONSTEXPR)
  10. #include <boost/config/pragma_message.hpp>
  11. BOOST_PRAGMA_MESSAGE("Skipping constexpr op==, op!= test because BOOST_MP11_HAS_CXX14_CONSTEXPR is not defined")
  12. int main() {}
  13. #else
  14. struct X
  15. {
  16. };
  17. inline constexpr bool operator==( X const&, X const& ) { return false; }
  18. inline constexpr bool operator!=( X const&, X const& ) { return false; }
  19. #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
  20. int main()
  21. {
  22. {
  23. constexpr variant<int> v1, v2, v3( 1 ), v4( 1 );
  24. STATIC_ASSERT( v1 == v2 );
  25. STATIC_ASSERT( !(v1 != v2) );
  26. STATIC_ASSERT( v1 != v3 );
  27. STATIC_ASSERT( !(v1 == v3) );
  28. STATIC_ASSERT( v3 == v4 );
  29. STATIC_ASSERT( !(v3 != v4) );
  30. }
  31. {
  32. constexpr variant<int, float> v1, v2, v3( 1 ), v4( 1 ), v5( 3.14f ), v6( 3.14f );
  33. STATIC_ASSERT( v1 == v2 );
  34. STATIC_ASSERT( !(v1 != v2) );
  35. STATIC_ASSERT( v1 != v3 );
  36. STATIC_ASSERT( !(v1 == v3) );
  37. STATIC_ASSERT( v3 == v4 );
  38. STATIC_ASSERT( !(v3 != v4) );
  39. STATIC_ASSERT( v1 != v5 );
  40. STATIC_ASSERT( !(v1 == v5) );
  41. STATIC_ASSERT( v3 != v5 );
  42. STATIC_ASSERT( !(v3 == v5) );
  43. STATIC_ASSERT( v5 == v6 );
  44. STATIC_ASSERT( !(v5 != v6) );
  45. }
  46. {
  47. constexpr variant<int, int, float> v1, v2, v3( in_place_index_t<1>{} ), v4( in_place_index_t<1>{} ), v5( 3.14f ), v6( 3.14f );
  48. STATIC_ASSERT( v1 == v2 );
  49. STATIC_ASSERT( !(v1 != v2) );
  50. STATIC_ASSERT( v1 != v3 );
  51. STATIC_ASSERT( !(v1 == v3) );
  52. STATIC_ASSERT( v3 == v4 );
  53. STATIC_ASSERT( !(v3 != v4) );
  54. STATIC_ASSERT( v1 != v5 );
  55. STATIC_ASSERT( !(v1 == v5) );
  56. STATIC_ASSERT( v3 != v5 );
  57. STATIC_ASSERT( !(v3 == v5) );
  58. STATIC_ASSERT( v5 == v6 );
  59. STATIC_ASSERT( !(v5 != v6) );
  60. }
  61. {
  62. constexpr variant<X> v1, v2;
  63. STATIC_ASSERT( !(v1 == v2) );
  64. STATIC_ASSERT( !(v1 != v2) );
  65. }
  66. }
  67. #endif