optional_test_make_optional.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright (C) 2017 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:
  10. // akrzemi1@gmail.com
  11. #include "boost/optional/optional.hpp"
  12. #ifdef __BORLANDC__
  13. #pragma hdrstop
  14. #endif
  15. #include "boost/core/ignore_unused.hpp"
  16. #include "boost/core/is_same.hpp"
  17. #include "boost/core/lightweight_test.hpp"
  18. #include "boost/core/lightweight_test_trait.hpp"
  19. using boost::optional;
  20. using boost::make_optional;
  21. using boost::core::is_same;
  22. template <typename Expected, typename Deduced>
  23. void verify_type(Deduced)
  24. {
  25. BOOST_TEST_TRAIT_TRUE(( is_same<Expected, Deduced> ));
  26. }
  27. #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
  28. struct MoveOnly
  29. {
  30. int value;
  31. explicit MoveOnly(int i) : value(i) {}
  32. MoveOnly(MoveOnly && r) : value(r.value) { r.value = 0; }
  33. MoveOnly& operator=(MoveOnly && r) { value = r.value; r.value = 0; return *this; }
  34. private:
  35. MoveOnly(MoveOnly const&);
  36. void operator=(MoveOnly const&);
  37. };
  38. MoveOnly makeMoveOnly(int i)
  39. {
  40. return MoveOnly(i);
  41. }
  42. void test_make_optional_for_move_only_type()
  43. {
  44. verify_type< optional<MoveOnly> >(make_optional(makeMoveOnly(2)));
  45. verify_type< optional<MoveOnly> >(make_optional(true, makeMoveOnly(2)));
  46. optional<MoveOnly> o1 = make_optional(makeMoveOnly(1));
  47. BOOST_TEST (o1);
  48. BOOST_TEST_EQ (1, o1->value);
  49. optional<MoveOnly> o2 = make_optional(true, makeMoveOnly(2));
  50. BOOST_TEST (o2);
  51. BOOST_TEST_EQ (2, o2->value);
  52. optional<MoveOnly> oN = make_optional(false, makeMoveOnly(2));
  53. BOOST_TEST (!oN);
  54. }
  55. #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
  56. void test_make_optional_for_optional()
  57. {
  58. optional<int> oi;
  59. verify_type< optional< optional<int> > >(make_optional(oi));
  60. verify_type< optional< optional<int> > >(make_optional(true, oi));
  61. optional< optional<int> > ooi = make_optional(oi);
  62. BOOST_TEST (ooi);
  63. BOOST_TEST (!*ooi);
  64. optional< optional<int> > ooT = make_optional(true, oi);
  65. BOOST_TEST (ooT);
  66. BOOST_TEST (!*ooT);
  67. optional< optional<int> > ooF = make_optional(false, oi);
  68. BOOST_TEST (!ooF);
  69. }
  70. void test_nested_make_optional()
  71. {
  72. verify_type< optional< optional<int> > >(make_optional(make_optional(1)));
  73. verify_type< optional< optional<int> > >(make_optional(true, make_optional(true, 2)));
  74. optional< optional<int> > oo1 = make_optional(make_optional(1));
  75. BOOST_TEST (oo1);
  76. BOOST_TEST (*oo1);
  77. BOOST_TEST_EQ (1, **oo1);
  78. optional< optional<int> > oo2 = make_optional(true, make_optional(true, 2));
  79. BOOST_TEST (oo2);
  80. BOOST_TEST (*oo2);
  81. BOOST_TEST_EQ (2, **oo2);
  82. optional< optional<int> > oo3 = make_optional(true, make_optional(false, 3));
  83. BOOST_TEST (oo3);
  84. BOOST_TEST (!*oo3);
  85. optional< optional<int> > oo4 = make_optional(false, make_optional(true, 4));
  86. BOOST_TEST (!oo4);
  87. }
  88. int main()
  89. {
  90. #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
  91. test_make_optional_for_move_only_type();
  92. #endif
  93. test_make_optional_for_optional();
  94. test_nested_make_optional();
  95. return boost::report_errors();
  96. }