2 // Copyright 2015, 2016, 2019 Peter Dimov.
4 // Distributed under the Boost Software License, Version 1.0.
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
10 #include <boost/mp11/function.hpp>
11 #include <boost/mp11/integral.hpp>
12 #include <boost/mp11/set.hpp>
13 #include <boost/mp11/detail/config.hpp>
14 #include <boost/core/lightweight_test_trait.hpp>
15 #include <type_traits>
17 using boost::mp11::mp_any
;
18 using boost::mp11::mp_all
;
20 template<class... T
> using check1
= mp_any
<std::is_nothrow_copy_constructible
<T
>..., mp_any
<std::is_nothrow_move_constructible
<T
>...>>;
21 template<class... T
> using check2
= mp_any
<mp_any
<std::is_nothrow_copy_constructible
<T
>...>, std::is_nothrow_move_constructible
<T
>...>;
22 template<class... T
> using check3
= mp_any
<mp_all
<std::is_nothrow_copy_constructible
<T
>...>, std::is_nothrow_default_constructible
<T
>...>;
24 template<bool is_trivially_destructible
, bool is_single_buffered
, class... T
> struct variant_base_impl
{};
25 #if BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 )
26 template<class... T
> using variant_base
= variant_base_impl
<mp_all
<std::has_trivial_destructor
<T
>...>::value
, mp_any
<mp_all
<std::is_nothrow_move_constructible
<T
>...>, std::is_nothrow_default_constructible
<T
>...>::value
, T
...>;
28 template<class... T
> using variant_base
= variant_base_impl
<mp_all
<std::is_trivially_destructible
<T
>...>::value
, mp_any
<mp_all
<std::is_nothrow_move_constructible
<T
>...>, std::is_nothrow_default_constructible
<T
>...>::value
, T
...>;
31 using boost::mp11::mp_set_contains
;
33 template<class T
, class... S
> using in_any_set
= mp_any
< mp_set_contains
<S
, T
>... >;
37 using boost::mp11::mp_true
;
38 using boost::mp11::mp_false
;
39 using boost::mp11::mp_int
;
40 using boost::mp11::mp_size_t
;
42 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<>, mp_false
>));
44 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_true
>, mp_true
>));
45 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
>, mp_false
>));
47 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_int
<-7>>, mp_true
>));
48 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_int
<0>>, mp_false
>));
50 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<7>>, mp_true
>));
51 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<0>>, mp_false
>));
53 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_true
, mp_true
>, mp_true
>));
54 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
, mp_true
>, mp_true
>));
55 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_true
, mp_false
>, mp_true
>));
56 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
, mp_false
>, mp_false
>));
58 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_int
<-7>, mp_int
<7>>, mp_true
>));
59 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<(size_t)-1>, mp_size_t
<1>>, mp_true
>));
61 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_true
, mp_true
, mp_true
>, mp_true
>));
62 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
, mp_false
, mp_true
>, mp_true
>));
63 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
, mp_false
, mp_false
>, mp_false
>));
65 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_true
, mp_true
, mp_true
, mp_true
>, mp_true
>));
66 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
, mp_false
, mp_true
, mp_false
>, mp_true
>));
67 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_false
, mp_false
, mp_false
, mp_false
>, mp_false
>));
69 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_int
<1>, mp_int
<2>, mp_int
<-11>, mp_int
<14>>, mp_true
>));
70 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_int
<0>, mp_int
<0>, mp_int
<-11>, mp_int
<0>>, mp_true
>));
71 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_int
<0>, mp_int
<0>, mp_int
<0>, mp_int
<0>>, mp_false
>));
73 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<1>, mp_size_t
<2>, mp_size_t
<114>, mp_size_t
<8>, mp_size_t
<94>>, mp_true
>));
74 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<0>, mp_size_t
<0>, mp_size_t
<114>, mp_size_t
<0>, mp_size_t
<0>>, mp_true
>));
75 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<0>, mp_size_t
<0>, mp_size_t
<0>, mp_size_t
<0>, mp_size_t
<0>>, mp_false
>));
77 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<0>, mp_int
<0>, mp_false
, mp_size_t
<141>>, mp_true
>));
78 BOOST_TEST_TRAIT_TRUE((std::is_same
<mp_any
<mp_size_t
<0>, mp_int
<0>, mp_false
>, mp_false
>));
80 BOOST_TEST_TRAIT_TRUE((std::is_same
<check1
<void, int, float>, mp_true
>));
81 BOOST_TEST_TRAIT_TRUE((std::is_same
<check2
<void, int, float>, mp_true
>));
82 BOOST_TEST_TRAIT_TRUE((std::is_same
<check3
<void, int, float>, mp_true
>));
84 variant_base
<void, int, float>();
86 using boost::mp11::mp_list
;
88 BOOST_TEST_TRAIT_TRUE((std::is_same
<in_any_set
<void, mp_list
<void>, mp_list
<int>>, mp_true
>));
90 return boost::report_errors();