1 // Copyright (C) 2014 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/lightweight_test.hpp"
21 using boost::optional
;
26 IntWrapper(int i
) : _i(i
) {}
27 bool operator==(IntWrapper
const& rhs
) const { return _i
== rhs
._i
; }
31 void test_function_value_or_for()
34 const optional
<T
> oC0
;
36 const optional
<T
> oC2(2);
38 BOOST_TEST(oM0
.value_or(5) == 5);
39 BOOST_TEST(oC0
.value_or(5) == 5);
40 BOOST_TEST(oM1
.value_or(5) == 1);
41 BOOST_TEST(oC2
.value_or(5) == 2);
45 void test_function_value_for()
49 const optional
<T
> oC(2);
63 T
const& v
= oC
.value();
71 BOOST_TEST_THROWS(o0
.value(), boost::bad_optional_access
);
74 void test_function_value()
76 test_function_value_for
<int>();
77 test_function_value_for
<double>();
78 test_function_value_for
<IntWrapper
>();
81 struct FatToIntConverter
83 static int conversions
;
85 FatToIntConverter(int val
) : _val(val
) {}
86 operator int() const { conversions
+= 1; return _val
; }
89 int FatToIntConverter::conversions
= 0;
91 void test_function_value_or()
93 test_function_value_or_for
<int>();
94 test_function_value_or_for
<double>();
95 test_function_value_or_for
<IntWrapper
>();
98 BOOST_TEST(oi
.value_or(FatToIntConverter(2)) == 1);
99 BOOST_TEST(FatToIntConverter::conversions
== 0);
102 BOOST_TEST(oi
.value_or(FatToIntConverter(2)) == 2);
103 BOOST_TEST(FatToIntConverter::conversions
== 1);
109 int operator()() { return 5; }
114 int operator()() const { return 6; }
127 void test_function_value_or_eval()
129 optional
<int> o1
= 1;
134 BOOST_TEST_EQ(o1
.value_or_eval(funM
), 1);
135 BOOST_TEST_EQ(oN
.value_or_eval(funM
), 5);
136 BOOST_TEST_EQ(o1
.value_or_eval(FunM()), 1);
137 BOOST_TEST_EQ(oN
.value_or_eval(FunM()), 5);
139 BOOST_TEST_EQ(o1
.value_or_eval(funC
), 1);
140 BOOST_TEST_EQ(oN
.value_or_eval(funC
), 6);
141 BOOST_TEST_EQ(o1
.value_or_eval(FunC()), 1);
142 BOOST_TEST_EQ(oN
.value_or_eval(FunC()), 6);
144 BOOST_TEST_EQ(o1
.value_or_eval(funP
), 1);
145 BOOST_TEST_EQ(oN
.value_or_eval(funP
), 7);
147 #ifndef BOOST_NO_CXX11_LAMBDAS
148 BOOST_TEST_EQ(o1
.value_or_eval([](){return 8;}), 1);
149 BOOST_TEST_EQ(oN
.value_or_eval([](){return 8;}), 8);
154 BOOST_TEST_EQ(o1
.value_or_eval(throw_
), 1);
161 BOOST_TEST_THROWS(oN
.value_or_eval(throw_
), int);
164 const optional
<std::string
> makeConstOptVal()
166 return std::string("something");
169 void test_const_move()
171 std::string s5
= *makeConstOptVal();
172 std::string s6
= makeConstOptVal().value();
173 boost::ignore_unused(s5
);
174 boost::ignore_unused(s6
);
178 #if (!defined BOOST_NO_CXX11_REF_QUALIFIERS) && (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
181 explicit MoveOnly(int){}
182 MoveOnly(MoveOnly
&&){}
183 void operator=(MoveOnly
&&);
185 MoveOnly(MoveOnly
const&);
186 void operator=(MoveOnly
const&);
189 optional
<MoveOnly
> makeMoveOnly()
194 MoveOnly
moveOnlyDefault()
200 void test_move_only_getters()
202 MoveOnly m1
= *makeMoveOnly();
203 MoveOnly m2
= makeMoveOnly().value();
204 MoveOnly m3
= makeMoveOnly().value_or(MoveOnly(1));
205 MoveOnly m4
= makeMoveOnly().value_or_eval(moveOnlyDefault
);
206 boost::ignore_unused(m1
);
207 boost::ignore_unused(m2
);
208 boost::ignore_unused(m3
);
209 boost::ignore_unused(m4
);
212 #endif // !defined BOOST_NO_CXX11_REF_QUALIFIERS
216 test_function_value();
217 test_function_value_or();
218 test_function_value_or_eval();
221 return boost::report_errors();