diff --git a/include/boost/variant2/variant.hpp b/include/boost/variant2/variant.hpp index a450eba..63d9c14 100644 --- a/include/boost/variant2/variant.hpp +++ b/include/boost/variant2/variant.hpp @@ -133,6 +133,14 @@ template struct variant_alternative_impl struct variant_alternative_impl&, true>: std::add_lvalue_reference< mp11::mp_at_c, I> > +{ +}; + +template struct variant_alternative_impl&&, true>: std::add_rvalue_reference< mp11::mp_at_c, I> > +{ +}; + } // namespace detail template struct variant_alternative @@ -155,6 +163,14 @@ template struct variant_alternative { }; +template struct variant_alternative&>: public detail::variant_alternative_impl&, (I < sizeof...(T))> +{ +}; + +template struct variant_alternative&&>: public detail::variant_alternative_impl&&, (I < sizeof...(T))> +{ +}; + #else namespace detail @@ -180,6 +196,14 @@ template struct variant_alternative { }; +template struct variant_alternative: mp11::mp_defer, T, mp11::mp_quote_trait> +{ +}; + +template struct variant_alternative: mp11::mp_defer, T, mp11::mp_quote_trait> +{ +}; + template struct variant_alternative>: mp11::mp_defer, mp11::mp_size_t> { }; diff --git a/test/variant_alternative.cpp b/test/variant_alternative.cpp index e5a9fa7..600c26c 100644 --- a/test/variant_alternative.cpp +++ b/test/variant_alternative.cpp @@ -25,65 +25,130 @@ int main() BOOST_TEST_TRAIT_TRUE((std::is_same volatile>, void volatile>)); BOOST_TEST_TRAIT_TRUE((std::is_same const volatile>, void const volatile>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&>, char&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&>, char const&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&&>, char&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&&>, char const&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, void>)); BOOST_TEST_TRAIT_TRUE((std::is_same const>, void const>)); BOOST_TEST_TRAIT_TRUE((std::is_same volatile>, void volatile>)); BOOST_TEST_TRAIT_TRUE((std::is_same const volatile>, void const volatile>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&>, char&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&>, char const&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&&>, char&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&&>, char const&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same const>, int const>)); BOOST_TEST_TRAIT_TRUE((std::is_same volatile>, int volatile>)); BOOST_TEST_TRAIT_TRUE((std::is_same const volatile>, int const volatile>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&>, int&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&>, int const&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&&>, int&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&&>, int const&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, void>)); BOOST_TEST_TRAIT_TRUE((std::is_same const>, void const>)); BOOST_TEST_TRAIT_TRUE((std::is_same volatile>, void volatile>)); BOOST_TEST_TRAIT_TRUE((std::is_same const volatile>, void const volatile>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&>, char&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&>, char const&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&&>, char&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&&>, char const&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same const>, int const>)); BOOST_TEST_TRAIT_TRUE((std::is_same volatile>, int volatile>)); BOOST_TEST_TRAIT_TRUE((std::is_same const volatile>, int const volatile>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&>, int&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&>, int const&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&&>, int&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&&>, int const&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, float>)); BOOST_TEST_TRAIT_TRUE((std::is_same const>, float const>)); BOOST_TEST_TRAIT_TRUE((std::is_same volatile>, float volatile>)); BOOST_TEST_TRAIT_TRUE((std::is_same const volatile>, float const volatile>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&>, float&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&>, float const&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same&&>, float&&>)); + BOOST_TEST_TRAIT_TRUE((std::is_same const&&>, float const&&>)); + variant_alternative<0, void>(); variant_alternative<0, void const>(); variant_alternative<0, void volatile>(); variant_alternative<0, void const volatile>(); + variant_alternative<0, int&>(); + variant_alternative<0, int const&>(); + variant_alternative<0, int&&>(); + variant_alternative<0, int const&&>(); + variant_alternative<0, variant<>>(); variant_alternative<0, variant<> const>(); variant_alternative<0, variant<> volatile>(); variant_alternative<0, variant<> const volatile>(); + variant_alternative<0, variant<>&>(); + variant_alternative<0, variant<> const&>(); + variant_alternative<0, variant<>&&>(); + variant_alternative<0, variant<> const&&>(); + variant_alternative<1, variant>(); variant_alternative<1, variant const>(); variant_alternative<1, variant volatile>(); variant_alternative<1, variant const volatile>(); + variant_alternative<1, variant&>(); + variant_alternative<1, variant const&>(); + variant_alternative<1, variant&&>(); + variant_alternative<1, variant const&&>(); + BOOST_TEST_TRAIT_FALSE((mp_valid, void>)); BOOST_TEST_TRAIT_FALSE((mp_valid, void const>)); BOOST_TEST_TRAIT_FALSE((mp_valid, void volatile>)); BOOST_TEST_TRAIT_FALSE((mp_valid, void const volatile>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, int&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, int const&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, int&&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, int const&&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant<>>)); BOOST_TEST_TRAIT_FALSE((mp_valid, variant<> const>)); BOOST_TEST_TRAIT_FALSE((mp_valid, variant<> volatile>)); BOOST_TEST_TRAIT_FALSE((mp_valid, variant<> const volatile>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant<>&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant<> const&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant<>&&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant<> const&&>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, variant>)); BOOST_TEST_TRAIT_TRUE((mp_valid, variant const>)); BOOST_TEST_TRAIT_TRUE((mp_valid, variant volatile>)); BOOST_TEST_TRAIT_TRUE((mp_valid, variant const volatile>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, variant&>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, variant const&>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, variant&&>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, variant const&&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant>)); BOOST_TEST_TRAIT_FALSE((mp_valid, variant const>)); BOOST_TEST_TRAIT_FALSE((mp_valid, variant volatile>)); BOOST_TEST_TRAIT_FALSE((mp_valid, variant const volatile>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant const&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant&&>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, variant const&&>)); + return boost::report_errors(); }