optional_ref_assign_test_defs.hpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright (C) 2014 Andrzej Krzemienski.
  2. //
  3. // Use, modification, and distribution is subject to the Boost Software
  4. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/lib/optional for documentation.
  8. //
  9. // You are welcome to contact the author at: akrzemi1@gmail.com
  10. #ifndef BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
  11. #define BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
  12. #include "boost/optional/optional.hpp"
  13. #ifdef __BORLANDC__
  14. #pragma hdrstop
  15. #endif
  16. #include "boost/core/addressof.hpp"
  17. #include "testable_classes.hpp"
  18. using boost::optional;
  19. using boost::none;
  20. using boost::addressof;
  21. template <typename T>
  22. void test_copy_assignment_for_const()
  23. {
  24. const typename concrete_type_of<T>::type v(2);
  25. optional<const T&> o;
  26. o = optional<const T&>(v);
  27. BOOST_TEST(o);
  28. BOOST_TEST(o != none);
  29. BOOST_TEST(addressof(*o) == addressof(v));
  30. BOOST_TEST(val(*o) == val(v));
  31. BOOST_TEST(val(*o) == 2);
  32. }
  33. template <typename T>
  34. void test_copy_assignment_for_noconst_const()
  35. {
  36. typename concrete_type_of<T>::type v(2);
  37. optional<const T&> o;
  38. o = optional<const T&>(v);
  39. BOOST_TEST(o);
  40. BOOST_TEST(o != none);
  41. BOOST_TEST(addressof(*o) == addressof(v));
  42. BOOST_TEST(val(*o) == val(v));
  43. BOOST_TEST(val(*o) == 2);
  44. val(v) = 9;
  45. BOOST_TEST(addressof(*o) == addressof(v));
  46. BOOST_TEST_EQ(val(*o), val(v));
  47. BOOST_TEST_EQ(val(*o), 9);
  48. BOOST_TEST_EQ(val(v), 9);
  49. }
  50. template <typename T>
  51. void test_copy_assignment_for()
  52. {
  53. typename concrete_type_of<T>::type v(2);
  54. optional<T&> o;
  55. o = optional<T&>(v);
  56. BOOST_TEST(o);
  57. BOOST_TEST(o != none);
  58. BOOST_TEST(addressof(*o) == addressof(v));
  59. BOOST_TEST(val(*o) == val(v));
  60. BOOST_TEST(val(*o) == 2);
  61. val(v) = 9;
  62. BOOST_TEST(addressof(*o) == addressof(v));
  63. BOOST_TEST_EQ(val(*o), val(v));
  64. BOOST_TEST_EQ(val(*o), 9);
  65. BOOST_TEST_EQ(val(v), 9);
  66. val(*o) = 7;
  67. BOOST_TEST(addressof(*o) == addressof(v));
  68. BOOST_TEST_EQ(val(*o), val(v));
  69. BOOST_TEST_EQ(val(*o), 7);
  70. BOOST_TEST_EQ(val(v), 7);
  71. }
  72. template <typename T>
  73. void test_rebinding_assignment_semantics_const()
  74. {
  75. const typename concrete_type_of<T>::type v(2), w(7);
  76. optional<const T&> o(v);
  77. BOOST_TEST(o);
  78. BOOST_TEST(addressof(*o) == addressof(v));
  79. BOOST_TEST_EQ(val(*o), val(v));
  80. BOOST_TEST_EQ(val(*o), 2);
  81. o = optional<const T&>(w);
  82. BOOST_TEST_EQ(val(v), 2);
  83. BOOST_TEST(o);
  84. BOOST_TEST(addressof(*o) != addressof(v));
  85. BOOST_TEST_NE(val(*o), val(v));
  86. BOOST_TEST_NE(val(*o), 2);
  87. BOOST_TEST(addressof(*o) == addressof(w));
  88. BOOST_TEST_EQ(val(*o), val(w));
  89. BOOST_TEST_EQ(val(*o), 7);
  90. }
  91. template <typename T>
  92. void test_rebinding_assignment_semantics_noconst_const()
  93. {
  94. typename concrete_type_of<T>::type v(2), w(7);
  95. optional<const T&> o(v);
  96. BOOST_TEST(o);
  97. BOOST_TEST(addressof(*o) == addressof(v));
  98. BOOST_TEST_EQ(val(*o), val(v));
  99. BOOST_TEST_EQ(val(*o), 2);
  100. o = optional<const T&>(w);
  101. BOOST_TEST_EQ(val(v), 2);
  102. BOOST_TEST(o);
  103. BOOST_TEST(addressof(*o) != addressof(v));
  104. BOOST_TEST_NE(val(*o), val(v));
  105. BOOST_TEST_NE(val(*o), 2);
  106. BOOST_TEST(addressof(*o) == addressof(w));
  107. BOOST_TEST_EQ(val(*o), val(w));
  108. BOOST_TEST_EQ(val(*o), 7);
  109. }
  110. template <typename T>
  111. void test_rebinding_assignment_semantics()
  112. {
  113. typename concrete_type_of<T>::type v(2), w(7);
  114. optional<T&> o(v);
  115. BOOST_TEST(o);
  116. BOOST_TEST(addressof(*o) == addressof(v));
  117. BOOST_TEST_EQ(val(*o), val(v));
  118. BOOST_TEST_EQ(val(*o), 2);
  119. o = optional<T&>(w);
  120. BOOST_TEST_EQ(val(v), 2);
  121. BOOST_TEST(o);
  122. BOOST_TEST(addressof(*o) != addressof(v));
  123. BOOST_TEST_NE(val(*o), val(v));
  124. BOOST_TEST_NE(val(*o), 2);
  125. BOOST_TEST(addressof(*o) == addressof(w));
  126. BOOST_TEST_EQ(val(*o), val(w));
  127. BOOST_TEST_EQ(val(*o), 7);
  128. val(*o) = 8;
  129. BOOST_TEST(addressof(*o) == addressof(w));
  130. BOOST_TEST_EQ(val(*o), val(w));
  131. BOOST_TEST_EQ(val(*o), 8);
  132. BOOST_TEST_EQ(val(w), 8);
  133. BOOST_TEST_EQ(val(v), 2);
  134. }
  135. template <typename T, typename U>
  136. void test_converting_assignment()
  137. {
  138. typename concrete_type_of<T>::type v1(1), v2(2), v3(3);
  139. optional<U&> oA(v1), oB(none);
  140. oA = v2;
  141. BOOST_TEST(oA);
  142. BOOST_TEST(addressof(*oA) == addressof(v2));
  143. oB = v3;
  144. BOOST_TEST(oB);
  145. BOOST_TEST(addressof(*oB) == addressof(v3));
  146. }
  147. #endif //BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP