// 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(v), 0 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 0 ); } { variant const v; BOOST_TEST_EQ( get(v), 0 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 0 ); } { variant v( 1 ); BOOST_TEST_EQ( get(v), 1 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 1 ); } { variant const v( 1 ); BOOST_TEST_EQ( get(v), 1 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(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(v), 0 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_THROWS( get(v), bad_variant_access ); BOOST_TEST_EQ( get_if(&v), nullptr ); BOOST_TEST_EQ( get(std::move(v)), 0 ); } { variant const v; BOOST_TEST_EQ( get(v), 0 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_THROWS( get(v), bad_variant_access ); BOOST_TEST_EQ( get_if(&v), nullptr ); BOOST_TEST_EQ( get(std::move(v)), 0 ); } { variant v( 1 ); BOOST_TEST_EQ( get(v), 1 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_THROWS( get(v), bad_variant_access ); BOOST_TEST_EQ( get_if(&v), nullptr ); BOOST_TEST_EQ( get(std::move(v)), 1 ); } { variant const v( 1 ); BOOST_TEST_EQ( get(v), 1 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_THROWS( get(v), bad_variant_access ); BOOST_TEST_EQ( get_if(&v), nullptr ); BOOST_TEST_EQ( get(std::move(v)), 1 ); } { variant v( 3.14f ); BOOST_TEST_THROWS( get(v), bad_variant_access ); BOOST_TEST_EQ( get_if(&v), nullptr ); BOOST_TEST_EQ( get(v), 3.14f ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 3.14f ); } { variant const v( 3.14f ); BOOST_TEST_THROWS( get(v), bad_variant_access ); BOOST_TEST_EQ( get_if(&v), nullptr ); BOOST_TEST_EQ( get(v), 3.14f ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 3.14f ); } { variant v; BOOST_TEST_EQ( get(v), 0 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 0 ); } { variant const v; BOOST_TEST_EQ( get(v), 0 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 0 ); } { variant v( 1 ); BOOST_TEST_EQ( get(v), 1 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 1 ); } { variant const v( 1 ); BOOST_TEST_EQ( get(v), 1 ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 1 ); } { variant v( 3.14f ); BOOST_TEST_EQ( get(v), 3.14f ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 3.14f ); } { variant const v( 3.14f ); BOOST_TEST_EQ( get(v), 3.14f ); BOOST_TEST_EQ( get_if(&v), &get(v) ); BOOST_TEST_EQ( get(std::move(v)), 3.14f ); } { variant * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); BOOST_TEST_EQ( get_if(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); BOOST_TEST_EQ( get_if(p), nullptr ); } { variant * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); } { variant const * p = 0; BOOST_TEST_EQ( get_if(p), nullptr ); } return boost::report_errors(); }