]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/optional/test/optional_test_make_optional.cpp
1 // Copyright (C) 2017 Andrzej Krzemienski.
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)
7 // See http://www.boost.org/lib/optional for documentation.
9 // You are welcome to contact the author at:
12 #include "boost/optional/optional.hpp"
18 #include "boost/core/ignore_unused.hpp"
19 #include "boost/core/is_same.hpp"
20 #include "boost/core/lightweight_test.hpp"
21 #include "boost/core/lightweight_test_trait.hpp"
24 using boost::optional
;
25 using boost::make_optional
;
26 using boost::core::is_same
;
28 template <typename Expected
, typename Deduced
>
29 void verify_type(Deduced
)
31 BOOST_TEST_TRAIT_TRUE(( is_same
<Expected
, Deduced
> ));
34 #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
38 explicit MoveOnly(int i
) : value(i
) {}
39 MoveOnly(MoveOnly
&& r
) : value(r
.value
) { r
.value
= 0; }
40 MoveOnly
& operator=(MoveOnly
&& r
) { value
= r
.value
; r
.value
= 0; return *this; }
43 MoveOnly(MoveOnly
const&);
44 void operator=(MoveOnly
const&);
47 MoveOnly
makeMoveOnly(int i
)
52 void test_make_optional_for_move_only_type()
54 verify_type
< optional
<MoveOnly
> >(make_optional(makeMoveOnly(2)));
55 verify_type
< optional
<MoveOnly
> >(make_optional(true, makeMoveOnly(2)));
57 optional
<MoveOnly
> o1
= make_optional(makeMoveOnly(1));
59 BOOST_TEST_EQ (1, o1
->value
);
61 optional
<MoveOnly
> o2
= make_optional(true, makeMoveOnly(2));
63 BOOST_TEST_EQ (2, o2
->value
);
65 optional
<MoveOnly
> oN
= make_optional(false, makeMoveOnly(2));
69 #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
71 void test_make_optional_for_optional()
74 verify_type
< optional
< optional
<int> > >(make_optional(oi
));
75 verify_type
< optional
< optional
<int> > >(make_optional(true, oi
));
77 optional
< optional
<int> > ooi
= make_optional(oi
);
81 optional
< optional
<int> > ooT
= make_optional(true, oi
);
85 optional
< optional
<int> > ooF
= make_optional(false, oi
);
89 void test_nested_make_optional()
91 verify_type
< optional
< optional
<int> > >(make_optional(make_optional(1)));
92 verify_type
< optional
< optional
<int> > >(make_optional(true, make_optional(true, 2)));
94 optional
< optional
<int> > oo1
= make_optional(make_optional(1));
97 BOOST_TEST_EQ (1, **oo1
);
99 optional
< optional
<int> > oo2
= make_optional(true, make_optional(true, 2));
102 BOOST_TEST_EQ (2, **oo2
);
104 optional
< optional
<int> > oo3
= make_optional(true, make_optional(false, 3));
108 optional
< optional
<int> > oo4
= make_optional(false, make_optional(true, 4));
114 #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
115 test_make_optional_for_move_only_type();
117 test_make_optional_for_optional();
118 test_nested_make_optional();
120 return boost::report_errors();