From 2357f4d2f4511b41a7f868d19295555da1d4f930 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 30 May 2017 16:57:48 +0300 Subject: [PATCH] Add test/variant_in_place_index_construct(_cx) --- include/boost/variant2/variant.hpp | 23 +++- test/Jamfile | 2 + test/variant_in_place_index_construct.cpp | 124 +++++++++++++++++++ test/variant_in_place_index_construct_cx.cpp | 116 +++++++++++++++++ 4 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 test/variant_in_place_index_construct.cpp create mode 100644 test/variant_in_place_index_construct_cx.cpp diff --git a/include/boost/variant2/variant.hpp b/include/boost/variant2/variant.hpp index bb44f3d..7b62e81 100644 --- a/include/boost/variant2/variant.hpp +++ b/include/boost/variant2/variant.hpp @@ -592,12 +592,32 @@ template struct in_place_type_t { }; +template constexpr in_place_type_t in_place_type{}; + +namespace detail +{ + +template struct is_in_place_type: std::false_type {}; +template struct is_in_place_type>: std::true_type {}; + +} // namespace detail + // in_place_index_t template struct in_place_index_t { }; +template constexpr in_place_index_t in_place_index{}; + +namespace detail +{ + +template struct is_in_place_index: std::false_type {}; +template struct is_in_place_index>: std::true_type {}; + +} // namespace detail + // variant template class variant: private variant2::detail::variant_base @@ -643,7 +663,8 @@ public: } template, variant>::value>, + class Ud = std::decay_t, + class E1 = std::enable_if_t< !std::is_same::value && !variant2::detail::is_in_place_index::value && !variant2::detail::is_in_place_type::value >, class V = variant2::detail::resolve_overload_type, class E2 = std::enable_if_t::value> > diff --git a/test/Jamfile b/test/Jamfile index 9495081..2c89a2f 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -25,3 +25,5 @@ run variant_copy_construct.cpp : : : $(REQ) ; run variant_move_construct.cpp : : : $(REQ) ; run variant_value_construct.cpp : : : $(REQ) ; compile variant_value_construct_cx.cpp : : : $(REQ) ; +run variant_in_place_index_construct.cpp : : : $(REQ) ; +compile variant_in_place_index_construct_cx.cpp : : : $(REQ) ; diff --git a/test/variant_in_place_index_construct.cpp b/test/variant_in_place_index_construct.cpp new file mode 100644 index 0000000..8f6c58f --- /dev/null +++ b/test/variant_in_place_index_construct.cpp @@ -0,0 +1,124 @@ + +// 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; + +struct X +{ + X() = default; + X( in_place_index_t<0> ) = delete; +}; + +int main() +{ + { + variant v( in_place_index<0> ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 0 ); + } + + { + variant v( in_place_index<0> ); + + BOOST_TEST_EQ( v.index(), 0 ); + } + + { + variant v( in_place_index<0>, 1 ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 1 ); + } + + { + variant v( in_place_index<0> ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 0 ); + } + + { + variant v( in_place_index<0>, 1 ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 1 ); + } + + { + variant v( in_place_index<1> ); + + BOOST_TEST_EQ( v.index(), 1 ); + BOOST_TEST_EQ( get<1>(v), 0 ); + } + + { + variant v( in_place_index<1>, 3.14f ); + + BOOST_TEST_EQ( v.index(), 1 ); + BOOST_TEST_EQ( get<1>(v), 3.14f ); + } + + { + variant v( in_place_index<0>, 1 ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 1 ); + } + + { + variant v( in_place_index<1>, 1 ); + + BOOST_TEST_EQ( v.index(), 1 ); + BOOST_TEST_EQ( get<1>(v), 1 ); + } + + { + variant v( in_place_index<2>, 3.14f ); + + BOOST_TEST_EQ( v.index(), 2 ); + BOOST_TEST_EQ( get<2>(v), 3.14f ); + } + + { + variant v( in_place_index<3>, 3.14f ); + + BOOST_TEST_EQ( v.index(), 3 ); + BOOST_TEST_EQ( get<3>(v), 3.14f ); + } + + { + variant v( in_place_index<4>, "text" ); + + BOOST_TEST_EQ( v.index(), 4 ); + BOOST_TEST_EQ( get<4>(v), std::string("text") ); + } + + { + variant v( in_place_index<5>, "text" ); + + BOOST_TEST_EQ( v.index(), 5 ); + BOOST_TEST_EQ( get<5>(v), std::string("text") ); + } + + { + variant v( in_place_index<5>, 4, 'a' ); + + BOOST_TEST_EQ( v.index(), 5 ); + BOOST_TEST_EQ( get<5>(v), std::string( 4, 'a' ) ); + } + + return boost::report_errors(); +} diff --git a/test/variant_in_place_index_construct_cx.cpp b/test/variant_in_place_index_construct_cx.cpp new file mode 100644 index 0000000..e9c771f --- /dev/null +++ b/test/variant_in_place_index_construct_cx.cpp @@ -0,0 +1,116 @@ + +// 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; + +struct X +{ + constexpr X() = default; + constexpr explicit X(int, int) {} + X( in_place_index_t<0> ) = delete; +}; + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +int main() +{ + { + constexpr variant v( in_place_index<0> ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 0 ); + } + + { + constexpr variant v( in_place_index<0> ); + + STATIC_ASSERT( v.index() == 0 ); + } + + { + constexpr variant v( in_place_index<0>, 1 ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 1 ); + } + + { + constexpr variant v( in_place_index<0> ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 0 ); + } + + { + constexpr variant v( in_place_index<0>, 1 ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 1 ); + } + + { + constexpr variant v( in_place_index<1> ); + + STATIC_ASSERT( v.index() == 1 ); + STATIC_ASSERT( get<1>(v) == 0 ); + } + + { + constexpr variant v( in_place_index<1>, 3.14f ); + + STATIC_ASSERT( v.index() == 1 ); + STATIC_ASSERT( get<1>(v) == 3.14f ); + } + + { + constexpr variant v( in_place_index<0>, 1 ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 1 ); + } + + { + constexpr variant v( in_place_index<1>, 1 ); + + STATIC_ASSERT( v.index() == 1 ); + STATIC_ASSERT( get<1>(v) == 1 ); + } + + { + constexpr variant v( in_place_index<2>, 3.14f ); + + STATIC_ASSERT( v.index() == 2 ); + STATIC_ASSERT( get<2>(v) == 3.14f ); + } + + { + constexpr variant v( in_place_index<3>, 3.14f ); + + STATIC_ASSERT( v.index() == 3 ); + STATIC_ASSERT( get<3>(v) == 3.14f ); + } + + { + constexpr variant v( in_place_index<4> ); + + STATIC_ASSERT( v.index() == 4 ); + } + + { + constexpr variant v( in_place_index<5>, 0, 0 ); + + STATIC_ASSERT( v.index() == 5 ); + } +}