]>
Commit | Line | Data |
---|---|---|
b32b8144 FG |
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 | ||
12 | #include "boost/optional/optional.hpp" | |
13 | ||
20effc67 | 14 | #ifdef BOOST_BORLANDC |
b32b8144 FG |
15 | #pragma hdrstop |
16 | #endif | |
17 | ||
18 | #include "boost/core/lightweight_test.hpp" | |
19 | #include "boost/core/lightweight_test_trait.hpp" | |
20 | #include "boost/type_traits/is_base_of.hpp" | |
21 | #include "boost/optional/detail/experimental_traits.hpp" | |
22 | ||
23 | #ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS | |
24 | ||
25 | struct PrivDefault | |
26 | { | |
27 | private: PrivDefault() {} | |
28 | }; | |
29 | ||
30 | struct CustDefault | |
31 | { | |
32 | CustDefault() {} | |
33 | }; | |
34 | ||
35 | struct CustomizedTrivial | |
36 | { | |
37 | CustomizedTrivial() {} | |
38 | }; | |
39 | ||
40 | struct DeletedDefault | |
41 | { | |
42 | BOOST_DELETED_FUNCTION(DeletedDefault()) | |
43 | }; | |
44 | ||
45 | namespace boost { namespace optional_config { | |
46 | ||
47 | template <> struct optional_uses_direct_storage_for<CustomizedTrivial> : boost::true_type {}; | |
48 | ||
49 | }} | |
50 | ||
51 | struct CustDtor | |
52 | { | |
53 | ~CustDtor() {} | |
54 | }; | |
55 | ||
56 | struct NoDefault | |
57 | { | |
58 | explicit NoDefault(int) {} | |
59 | }; | |
60 | ||
61 | struct Empty {}; | |
62 | ||
63 | template <typename T, typename U> | |
64 | struct Aggregate { T t; U u; }; | |
65 | ||
66 | struct CustAssign | |
67 | { | |
68 | CustAssign& operator=(CustAssign const&) { return *this; } | |
69 | }; | |
70 | ||
71 | struct CustMove | |
72 | { | |
73 | CustMove(CustMove &&) {} | |
74 | }; | |
75 | ||
76 | void test_type_traits() | |
77 | { | |
78 | // this only tests if type traits are implemented correctly | |
79 | BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for<int> )); | |
80 | BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for<double> )); | |
81 | ||
82 | BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for<CustomizedTrivial> )); | |
83 | ||
84 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<PrivDefault> )); | |
85 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<NoDefault> )); | |
86 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<CustDefault> )); | |
87 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<Aggregate<int, CustDefault> > )); | |
88 | ||
89 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<CustDtor> )); | |
90 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<CustAssign> )); | |
91 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<CustMove> )); | |
92 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<Aggregate<int, CustMove> > )); | |
93 | ||
94 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<int> )); | |
95 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<double> )); | |
96 | ||
97 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<Empty> )); | |
98 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<Aggregate<int, double> > )); | |
99 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<Aggregate<Aggregate<Empty, int>, double> > )); | |
100 | #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES | |
101 | ||
102 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<Empty> )); | |
103 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<Aggregate<int, double> > )); | |
104 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<Aggregate<Aggregate<Empty, int>, double> > )); | |
105 | ||
106 | #endif | |
107 | ||
108 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<DeletedDefault> )); | |
109 | BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for<Aggregate<int, DeletedDefault> > )); | |
110 | ||
111 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<CustDtor> )); | |
112 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<CustAssign> )); | |
113 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<CustMove> )); | |
114 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<Aggregate<int, CustMove> > )); | |
115 | } | |
116 | ||
117 | void test_trivial_copyability() | |
118 | { | |
119 | BOOST_TEST_TRAIT_TRUE((boost::is_base_of<boost::optional_detail::tc_optional_base<int>, boost::optional<int> > )); | |
120 | BOOST_TEST_TRAIT_TRUE((boost::is_base_of<boost::optional_detail::tc_optional_base<double>, boost::optional<double> > )); | |
121 | BOOST_TEST_TRAIT_TRUE((boost::is_base_of<boost::optional_detail::tc_optional_base<CustomizedTrivial>, boost::optional<CustomizedTrivial> > )); | |
122 | BOOST_TEST_TRAIT_FALSE((boost::is_base_of<boost::optional_detail::tc_optional_base<DeletedDefault>, boost::optional<DeletedDefault> > )); | |
123 | ||
124 | #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES | |
125 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<int> > )); | |
126 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<double> > )); | |
127 | BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<CustomizedTrivial> > )); | |
128 | ||
129 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<DeletedDefault> > )); | |
130 | #endif | |
131 | ||
132 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<Empty> > )); | |
133 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<Aggregate<int, double> > > )); | |
134 | BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable<boost::optional<Aggregate<Aggregate<Empty, int>, double> > > )); | |
135 | } | |
136 | ||
137 | #endif | |
138 | ||
139 | int main() | |
140 | { | |
141 | #ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS | |
142 | test_type_traits(); | |
143 | test_trivial_copyability(); | |
144 | #endif | |
145 | return boost::report_errors(); | |
146 | } |