From 21acb2bda0d4d6d80ddf4e9582a46b600de84b50 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 30 May 2017 17:12:26 +0300 Subject: [PATCH] Add test/variant_in_place_type_construct(_cx) --- test/Jamfile | 2 + test/variant_in_place_type_construct.cpp | 116 ++++++++++++++++++++ test/variant_in_place_type_construct_cx.cpp | 110 +++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 test/variant_in_place_type_construct.cpp create mode 100644 test/variant_in_place_type_construct_cx.cpp diff --git a/test/Jamfile b/test/Jamfile index 2c89a2f..6192882 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -27,3 +27,5 @@ 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) ; +run variant_in_place_type_construct.cpp : : : $(REQ) ; +compile variant_in_place_type_construct_cx.cpp : : : $(REQ) ; diff --git a/test/variant_in_place_type_construct.cpp b/test/variant_in_place_type_construct.cpp new file mode 100644 index 0000000..7a04cae --- /dev/null +++ b/test/variant_in_place_type_construct.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 +{ + X() = default; + template X( in_place_type_t ) = delete; +}; + +int main() +{ + { + variant v( in_place_type ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 0 ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type ); + + BOOST_TEST_EQ( v.index(), 0 ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type, 1 ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 1 ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 0 ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type, 1 ); + + BOOST_TEST_EQ( v.index(), 0 ); + BOOST_TEST_EQ( get<0>(v), 1 ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type ); + + BOOST_TEST_EQ( v.index(), 1 ); + BOOST_TEST_EQ( get<1>(v), 0 ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type, 3.14f ); + + BOOST_TEST_EQ( v.index(), 1 ); + BOOST_TEST_EQ( get<1>(v), 3.14f ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type, 3.14f ); + + BOOST_TEST_EQ( v.index(), 2 ); + BOOST_TEST_EQ( get<2>(v), 3.14f ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type, "text" ); + + BOOST_TEST_EQ( v.index(), 4 ); + BOOST_TEST_EQ( get<4>(v), std::string("text") ); + + BOOST_TEST( holds_alternative(v) ); + } + + { + variant v( in_place_type, 4, 'a' ); + + BOOST_TEST_EQ( v.index(), 4 ); + BOOST_TEST_EQ( get<4>(v), std::string( 4, 'a' ) ); + + BOOST_TEST( holds_alternative(v) ); + } + + return boost::report_errors(); +} diff --git a/test/variant_in_place_type_construct_cx.cpp b/test/variant_in_place_type_construct_cx.cpp new file mode 100644 index 0000000..054159b --- /dev/null +++ b/test/variant_in_place_type_construct_cx.cpp @@ -0,0 +1,110 @@ + +// 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 + +using namespace boost::variant2; + +struct X +{ + constexpr X() = default; + constexpr explicit X(int, int) {} + template X( in_place_type_t ) = delete; +}; + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +int main() +{ + { + constexpr variant v( in_place_type ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 0 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type ); + + STATIC_ASSERT( v.index() == 0 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type, 1 ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 1 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 0 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type, 1 ); + + STATIC_ASSERT( v.index() == 0 ); + STATIC_ASSERT( get<0>(v) == 1 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type ); + + STATIC_ASSERT( v.index() == 1 ); + STATIC_ASSERT( get<1>(v) == 0 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type, 3.14f ); + + STATIC_ASSERT( v.index() == 1 ); + STATIC_ASSERT( get<1>(v) == 3.14f ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type, 3.14f ); + + STATIC_ASSERT( v.index() == 2 ); + STATIC_ASSERT( get<2>(v) == 3.14f ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type ); + + STATIC_ASSERT( v.index() == 4 ); + + STATIC_ASSERT( holds_alternative(v) ); + } + + { + constexpr variant v( in_place_type, 0, 0 ); + + STATIC_ASSERT( v.index() == 4 ); + + STATIC_ASSERT( holds_alternative(v) ); + } +}