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:
10 //  [email protected]
11 
12 #include "boost/optional/optional.hpp"
13 
14 #ifdef BOOST_BORLANDC
15 #pragma hdrstop
16 #endif
17 
18 #include "boost/core/lightweight_test.hpp"
19 #include "boost/none.hpp"
20 
21 //#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
22 
23 using boost::optional;
24 using boost::none;
25 
26 template <typename U>
27 struct superconv
28 {
29   #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
30   template <typename T>
superconvsuperconv31     superconv(T&&) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
32   #else
33   template <typename T>
34     superconv(const T&) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
35   template <typename T>
36     superconv(      T&) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
37   #endif
38 
superconvsuperconv39   superconv() {}
40 };
41 
test_optional_of_superconverting_T()42 void test_optional_of_superconverting_T() // compile-time test
43 {
44 #ifndef BOOST_OPTIONAL_DETAIL_NO_IS_CONSTRUCTIBLE_TRAIT
45   superconv<optional<int> > s;
46    superconv<optional<int> > & rs = s;
47   optional<superconv<optional<int> > > os = rs;
48 #endif
49 }
50 
test_optional_optional_T()51 void test_optional_optional_T()
52 {
53   optional<int> oi1 (1), oiN;
54   optional< optional<int> > ooi1 (oi1), ooiN(oiN);
55 
56   BOOST_TEST(ooi1);
57   BOOST_TEST(*ooi1);
58   BOOST_TEST_EQ(**ooi1, 1);
59 
60   BOOST_TEST(ooiN);
61   BOOST_TEST(!*ooiN);
62 }
63 
main()64 int main()
65 {
66     test_optional_optional_T();
67     test_optional_of_superconverting_T();
68 
69     return boost::report_errors();
70 }
71