]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/optional/test/optional_test_ref_converting_ctor.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / optional / test / optional_test_ref_converting_ctor.cpp
CommitLineData
7c673cae
FG
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
11
12#include "boost/optional/optional.hpp"
13
20effc67 14#ifdef BOOST_BORLANDC
7c673cae
FG
15#pragma hdrstop
16#endif
17
18#include "boost/core/addressof.hpp"
19#include "boost/core/enable_if.hpp"
20#include "boost/core/lightweight_test.hpp"
21#include "testable_classes.hpp"
22
23using boost::optional;
24using boost::none;
25
26template <typename T>
27void test_converting_ctor()
28{
29 typename concrete_type_of<T>::type v1(1), v2(2);
30
31 {
32 optional<T&> o1 = v1, o1_ = v1, o2 = v2;
33
34 BOOST_TEST(o1);
35 BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
36 BOOST_TEST(o1_);
37 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
38 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
39
40 BOOST_TEST(o2);
41 BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
42 BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
43 }
44 {
45 const optional<T&> o1 = v1, o1_ = v1, o2 = v2;
46
47 BOOST_TEST(o1);
48 BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
49 BOOST_TEST(o1_);
50 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
51 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
52
53 BOOST_TEST(o2);
54 BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
55 BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
56 }
57}
58
59template <typename T>
60void test_converting_ctor_for_noconst_const()
61{
62 typename concrete_type_of<T>::type v1(1), v2(2);
63
64 {
65 optional<const T&> o1 = v1, o1_ = v1, o2 = v2;
66
67 BOOST_TEST(o1);
68 BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
69 BOOST_TEST(o1_);
70 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
71 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
72
73 BOOST_TEST(o2);
74 BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
75 BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
76 }
77 {
78 const optional<const T&> o1 = v1, o1_ = v1, o2 = v2;
79
80 BOOST_TEST(o1);
81 BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
82 BOOST_TEST(o1_);
83 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
84 BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
85
86 BOOST_TEST(o2);
87 BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
88 BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
89 }
90}
91
92template <typename T>
93void test_all_const_cases()
94{
95 test_converting_ctor<T>();
f67539c2 96#ifndef BOOST_OPTIONAL_CONFIG_NO_PROPER_CONVERT_FROM_CONST_INT
7c673cae 97 test_converting_ctor<const T>();
f67539c2 98#endif
7c673cae
FG
99 test_converting_ctor_for_noconst_const<T>();
100}
101
102int main()
103{
104 test_all_const_cases<int>();
105 test_all_const_cases<ScopeGuard>();
106 test_all_const_cases<Abstract>();
107 test_all_const_cases< optional<int> >();
108
109 return boost::report_errors();
110}