// Copyright 2017 Peter Dimov. // // Distributed under the Boost Software License, Version 1.0. // // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include using namespace boost::variant2; int main() { { variant v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int*>)); } { variant const v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int const&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int const&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int const*>)); } { variant v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int const&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int const&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int const*>)); } { variant const v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int const volatile&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int const volatile&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int const volatile*>)); } { variant v; BOOST_TEST_EQ( get<0>(v), 0 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_EQ( get<0>(std::move(v)), 0 ); } { variant const v; BOOST_TEST_EQ( get<0>(v), 0 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_EQ( get<0>(std::move(v)), 0 ); } { variant v( 1 ); BOOST_TEST_EQ( get<0>(v), 1 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_EQ( get<0>(std::move(v)), 1 ); } { variant const v( 1 ); BOOST_TEST_EQ( get<0>(v), 1 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_EQ( get<0>(std::move(v)), 1 ); } { variant v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int*>)); BOOST_TEST_TRAIT_TRUE((std::is_same(v)), float&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), float&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), float*>)); } { variant const v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int const&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int const&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int const*>)); BOOST_TEST_TRAIT_TRUE((std::is_same(v)), float const&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), float const&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), float const*>)); } { variant v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int const&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int const&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int const*>)); BOOST_TEST_TRAIT_TRUE((std::is_same(v)), float volatile&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), float volatile&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), float volatile*>)); } { variant const v; BOOST_TEST_TRAIT_TRUE((std::is_same(v)), int const&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), int const&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), int const*>)); BOOST_TEST_TRAIT_TRUE((std::is_same(v)), float const volatile&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(std::move(v))), float const volatile&&>)); BOOST_TEST_TRAIT_TRUE((std::is_same(&v)), float const volatile*>)); } { variant v; BOOST_TEST_EQ( get<0>(v), 0 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 0 ); } { variant const v; BOOST_TEST_EQ( get<0>(v), 0 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 0 ); } { variant v( 1 ); BOOST_TEST_EQ( get<0>(v), 1 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 1 ); } { variant const v( 1 ); BOOST_TEST_EQ( get<0>(v), 1 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 1 ); } { variant v( 3.14f ); BOOST_TEST_THROWS( get<0>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<0>(&v), nullptr ); BOOST_TEST_EQ( get<1>(v), 3.14f ); BOOST_TEST_EQ( get_if<1>(&v), &get<1>(v) ); BOOST_TEST_EQ( get<1>(std::move(v)), 3.14f ); } { variant const v( 3.14f ); BOOST_TEST_THROWS( get<0>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<0>(&v), nullptr ); BOOST_TEST_EQ( get<1>(v), 3.14f ); BOOST_TEST_EQ( get_if<1>(&v), &get<1>(v) ); BOOST_TEST_EQ( get<1>(std::move(v)), 3.14f ); } { variant v; BOOST_TEST_EQ( get<0>(v), 0 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_THROWS( get<2>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<2>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 0 ); } { variant const v; BOOST_TEST_EQ( get<0>(v), 0 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_THROWS( get<2>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<2>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 0 ); } { variant v( 1 ); BOOST_TEST_EQ( get<0>(v), 1 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_THROWS( get<2>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<2>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 1 ); } { variant const v( 1 ); BOOST_TEST_EQ( get<0>(v), 1 ); BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_THROWS( get<2>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<2>(&v), nullptr ); BOOST_TEST_EQ( get<0>(std::move(v)), 1 ); } { variant v( 3.14f ); BOOST_TEST_THROWS( get<0>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<0>(&v), nullptr ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_EQ( get<2>(v), 3.14f ); BOOST_TEST_EQ( get_if<2>(&v), &get<2>(v) ); BOOST_TEST_EQ( get<2>(std::move(v)), 3.14f ); } { variant const v( 3.14f ); BOOST_TEST_THROWS( get<0>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<0>(&v), nullptr ); BOOST_TEST_THROWS( get<1>(v), bad_variant_access ); BOOST_TEST_EQ( get_if<1>(&v), nullptr ); BOOST_TEST_EQ( get<2>(v), 3.14f ); BOOST_TEST_EQ( get_if<2>(&v), &get<2>(v) ); BOOST_TEST_EQ( get<2>(std::move(v)), 3.14f ); } { variant * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if<0>(p), nullptr ); } return boost::report_errors(); }