forked from boostorg/variant2
Merge branch 'develop'
This commit is contained in:
225
.travis.yml
Normal file
225
.travis.yml
Normal file
@ -0,0 +1,225 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
language: cpp
|
||||
|
||||
sudo: false
|
||||
|
||||
python: "2.7"
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
|
||||
env:
|
||||
matrix:
|
||||
- BOGUS_JOB=true
|
||||
|
||||
matrix:
|
||||
|
||||
exclude:
|
||||
- env: BOGUS_JOB=true
|
||||
|
||||
include:
|
||||
- os: linux
|
||||
compiler: g++-5
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-5
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-6
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-6
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.5
|
||||
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.5
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.5
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.6
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.6
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.7
|
||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.7
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.8
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.8
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.9
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.9
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.9
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.9
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-4.0
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-4.0
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-4.0
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-4.0
|
||||
|
||||
- os: osx
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14
|
||||
|
||||
- os: osx
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++1z
|
||||
|
||||
install:
|
||||
- cd ..
|
||||
- git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule update --init tools/build
|
||||
- git submodule update --init libs/config
|
||||
- git submodule update --init tools/boostdep
|
||||
- git clone -b $TRAVIS_BRANCH https://github.com/pdimov/mp11 libs/mp11
|
||||
- mkdir libs/variant2
|
||||
- cp -r $TRAVIS_BUILD_DIR/* libs/variant2
|
||||
- python tools/boostdep/depinst/depinst.py variant2
|
||||
- ./bootstrap.sh
|
||||
- ./b2 headers
|
||||
|
||||
script:
|
||||
- |-
|
||||
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
|
||||
- ./b2 libs/variant2/test toolset=$TOOLSET
|
||||
|
||||
notifications:
|
||||
email:
|
||||
on_success: always
|
14
README.md
14
README.md
@ -1,2 +1,14 @@
|
||||
# variant2
|
||||
A never-valueless implementation of std::variant
|
||||
|
||||
A never-valueless C++14 implementation of [std::variant](http://en.cppreference.com/w/cpp/utility/variant). Requires [mp11](https://github.com/pdimov/mp11) and Boost.Config. Intended to be placed into the `libs/variant2` directory of a Boost clone or release, with mp11 in `libs/mp11`.
|
||||
|
||||
To avoid the valueless state, this implementation falls back to using double storage unless
|
||||
|
||||
* all the contained types are nothrow move constructible, or
|
||||
* at least one contained type has a nothrow default constructor.
|
||||
|
||||
Supported compilers:
|
||||
|
||||
* g++ 5 or later with -std=c++14 or -std=c++1z
|
||||
* clang++ 3.5 or later with -std=c++14 or -std=c++1z
|
||||
* Visual Studio 2017
|
||||
|
36
appveyor.yml
Normal file
36
appveyor.yml
Normal file
@ -0,0 +1,36 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
version: 1.0.{build}-{branch}
|
||||
|
||||
shallow_clone: true
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
TOOLSET: msvc-14.1
|
||||
|
||||
install:
|
||||
- cd ..
|
||||
- git clone -b %APPVEYOR_REPO_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule update --init tools/build
|
||||
- git submodule update --init libs/config
|
||||
- git submodule update --init tools/boostdep
|
||||
- git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/pdimov/mp11 libs/mp11
|
||||
- mkdir libs\variant2
|
||||
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\variant2
|
||||
- python tools/boostdep/depinst/depinst.py variant2
|
||||
- bootstrap
|
||||
- b2 headers
|
||||
|
||||
build: off
|
||||
|
||||
test_script:
|
||||
- b2 libs/variant2/test toolset=%TOOLSET%
|
1154
include/boost/variant2/variant.hpp
Normal file
1154
include/boost/variant2/variant.hpp
Normal file
File diff suppressed because it is too large
Load Diff
14
meta/libraries.json
Normal file
14
meta/libraries.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"key": "variant2",
|
||||
"name": "Variant2",
|
||||
"authors": [
|
||||
"Peter Dimov"
|
||||
],
|
||||
"maintainers": [
|
||||
"Peter Dimov <pdimov -at- pdimov.com>"
|
||||
],
|
||||
"description": "A never-valueless implementation of std::variant.",
|
||||
"category": [
|
||||
"Containers", "Data"
|
||||
]
|
||||
}
|
40
test/Jamfile
Normal file
40
test/Jamfile
Normal file
@ -0,0 +1,40 @@
|
||||
# Boost.Variant2 Library Test Jamfile
|
||||
#
|
||||
# Copyright 2015-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
|
||||
|
||||
import testing ;
|
||||
import ../../config/checks/config : requires ;
|
||||
|
||||
REQ = ; #[ requires cxx11_variadic_templates cxx11_template_aliases cxx11_decltype cxx11_hdr_type_traits ] ;
|
||||
|
||||
run variant_size.cpp : : : $(REQ) ;
|
||||
run variant_alternative.cpp : : : $(REQ) ;
|
||||
run variant_holds_alternative.cpp : : : $(REQ) ;
|
||||
compile variant_holds_alternative_cx.cpp : : : $(REQ) ;
|
||||
run variant_get_by_index.cpp : : : $(REQ) ;
|
||||
compile variant_get_by_index_cx.cpp : : : $(REQ) ;
|
||||
run variant_get_by_type.cpp : : : $(REQ) ;
|
||||
compile variant_get_by_type_cx.cpp : : : $(REQ) ;
|
||||
run variant_default_construct.cpp : : : $(REQ) ;
|
||||
compile variant_default_construct_cx.cpp : : : $(REQ) ;
|
||||
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) ;
|
||||
run variant_in_place_type_construct.cpp : : : $(REQ) ;
|
||||
compile variant_in_place_type_construct_cx.cpp : : : $(REQ) ;
|
||||
run variant_copy_assign.cpp : : : $(REQ) ;
|
||||
run variant_move_assign.cpp : : : $(REQ) ;
|
||||
run variant_value_assign.cpp : : : $(REQ) ;
|
||||
run variant_emplace_index.cpp : : : $(REQ) ;
|
||||
run variant_emplace_type.cpp : : : $(REQ) ;
|
||||
run variant_swap.cpp : : : $(REQ) ;
|
||||
run variant_eq_ne.cpp : : : $(REQ) ;
|
||||
run variant_destroy.cpp : : : $(REQ) ;
|
||||
run variant_visit.cpp : : : $(REQ) ;
|
89
test/variant_alternative.cpp
Normal file
89
test/variant_alternative.cpp
Normal file
@ -0,0 +1,89 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/mp11.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <cstddef>
|
||||
|
||||
using namespace boost::variant2;
|
||||
using namespace boost::mp11;
|
||||
|
||||
template<class I, class T> using var_alt_t = variant_alternative_t<I::value, T>;
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void>>, void>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void> const>, void const>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void> volatile>, void volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void> const volatile>, void const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int>>, void>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int> const>, void const>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int> volatile>, void volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int> const volatile>, void const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int>>, int>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int> const>, int const>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int> volatile>, int volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int> const volatile>, int const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int, float>>, void>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int, float> const>, void const>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int, float> volatile>, void volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<0, variant<void, int, float> const volatile>, void const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int, float>>, int>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int, float> const>, int const>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int, float> volatile>, int volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<1, variant<void, int, float> const volatile>, int const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<2, variant<void, int, float>>, float>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<2, variant<void, int, float> const>, float const>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<2, variant<void, int, float> volatile>, float volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<variant_alternative_t<2, variant<void, int, float> const volatile>, float const volatile>));
|
||||
|
||||
variant_alternative<0, void>();
|
||||
variant_alternative<0, void const>();
|
||||
variant_alternative<0, void volatile>();
|
||||
variant_alternative<0, void const volatile>();
|
||||
|
||||
variant_alternative<0, variant<>>();
|
||||
variant_alternative<0, variant<> const>();
|
||||
variant_alternative<0, variant<> volatile>();
|
||||
variant_alternative<0, variant<> const volatile>();
|
||||
|
||||
variant_alternative<1, variant<int>>();
|
||||
variant_alternative<1, variant<int> const>();
|
||||
variant_alternative<1, variant<int> volatile>();
|
||||
variant_alternative<1, variant<int> const volatile>();
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, void>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, void const>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, void volatile>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, void const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, variant<>>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, variant<> const>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, variant<> volatile>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<0>, variant<> const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_alt_t, mp_size_t<0>, variant<int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_alt_t, mp_size_t<0>, variant<int> const>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_alt_t, mp_size_t<0>, variant<int> volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_alt_t, mp_size_t<0>, variant<int> const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<1>, variant<int>>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<1>, variant<int> const>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<1>, variant<int> volatile>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_alt_t, mp_size_t<1>, variant<int> const volatile>));
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
194
test/variant_copy_assign.cpp
Normal file
194
test/variant_copy_assign.cpp
Normal file
@ -0,0 +1,194 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
int v;
|
||||
|
||||
X1(): v(0) {}
|
||||
explicit X1(int v): v(v) {}
|
||||
X1(X1 const& r): v(r.v) {}
|
||||
X1(X1&& r): v(r.v) {}
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
int v;
|
||||
|
||||
X2(): v(0) {}
|
||||
explicit X2(int v): v(v) {}
|
||||
X2(X2 const& r): v(r.v) {}
|
||||
X2(X2&& r): v(r.v) {}
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
|
||||
|
||||
struct Y
|
||||
{
|
||||
Y& operator=( Y const& ) = delete;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int> v2( 1 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
variant<int> const v3( 2 );
|
||||
|
||||
v = v3;
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int, float> v2( 1 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
variant<int, float> v3( 3.14f );
|
||||
|
||||
v = v3;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
variant<int, float> const v4( 3.15f );
|
||||
|
||||
v = v4;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.15f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int, int, float, std::string> v2( in_place_index<1>, 1 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 1 );
|
||||
|
||||
variant<int, int, float, std::string> v3( 3.14f );
|
||||
|
||||
v = v3;
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
variant<int, int, float, std::string> const v4( 3.15f );
|
||||
|
||||
v = v4;
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.15f );
|
||||
|
||||
variant<int, int, float, std::string> v5( "s1" );
|
||||
|
||||
v = v5;
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s1") );
|
||||
|
||||
variant<int, int, float, std::string> const v6( "s2" );
|
||||
|
||||
v = v6;
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
variant<X1, X2> v2( X1{1} );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 1 );
|
||||
|
||||
variant<X1, X2> v3( in_place_index<1>, 2 );
|
||||
|
||||
v = v3;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 2 );
|
||||
|
||||
variant<X1, X2> const v4( in_place_index<1>, 3 );
|
||||
|
||||
v = v4;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 3 );
|
||||
|
||||
variant<X1, X2> const v5( in_place_index<0>, 4 );
|
||||
|
||||
v = v5;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
}
|
||||
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_assignable<variant<int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_assignable<variant<int, int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_assignable<variant<int, float>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_assignable<variant<int, int, float, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<X1, int>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<X1, int, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<int, X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<int, int, X1>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_assignable<variant<X1, X2, int, int>>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_copy_assignable<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_copy_assignable<variant<int const>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_copy_assignable<variant<int, float, Y>>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
128
test/variant_copy_construct.cpp
Normal file
128
test/variant_copy_construct.cpp
Normal file
@ -0,0 +1,128 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
X1() {}
|
||||
X1(X1 const&) {}
|
||||
X1(X1&&) {}
|
||||
};
|
||||
|
||||
inline bool operator==( X1, X1 ) { return true; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
X2() {}
|
||||
X2(X2 const&) {}
|
||||
X2(X2&&) {}
|
||||
};
|
||||
|
||||
inline bool operator==( X2, X2 ) { return true; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
|
||||
struct Y
|
||||
{
|
||||
Y( Y const& ) = delete;
|
||||
};
|
||||
|
||||
template<class V> static void test( V const & v )
|
||||
{
|
||||
V v2( v );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), v2.index() );
|
||||
BOOST_TEST( v == v2 );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test( variant<int>() );
|
||||
test( variant<int>(1) );
|
||||
|
||||
test( variant<int const>() );
|
||||
test( variant<int const>(1) );
|
||||
|
||||
test( variant<int, float>() );
|
||||
test( variant<int, float>(1) );
|
||||
test( variant<int, float>(3.14f) );
|
||||
|
||||
test( variant<int, float, std::string>() );
|
||||
test( variant<int, float, std::string>(1) );
|
||||
test( variant<int, float, std::string>(3.14f) );
|
||||
test( variant<int, float, std::string>("test") );
|
||||
|
||||
test( variant<int, int>() );
|
||||
|
||||
test( variant<int, int, float>() );
|
||||
test( variant<int, int, float>(3.14f) );
|
||||
|
||||
test( variant<int, int, float, float>() );
|
||||
|
||||
test( variant<int, int, float, float, std::string>("test") );
|
||||
|
||||
test( variant<std::string, std::string, float>() );
|
||||
|
||||
test( variant<X1, X2>() );
|
||||
test( variant<X1, X2, int>() );
|
||||
test( variant<X1, X2, X2>() );
|
||||
test( variant<X1, X1, X2, X2>() );
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
v.emplace<X2>();
|
||||
|
||||
test( v );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X1, X2> v;
|
||||
v.emplace<X2>();
|
||||
|
||||
test( v );
|
||||
}
|
||||
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_constructible<variant<int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_constructible<variant<int const>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_constructible<variant<int, int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_constructible<variant<int, float>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_copy_constructible<variant<int, int, float, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<X1, int>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<X1, int, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<int, X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<int, int, X1>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_copy_constructible<variant<X1, X2, int, int>>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_copy_constructible<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_copy_constructible<variant<int, float, Y>>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
103
test/variant_default_construct.cpp
Normal file
103
test/variant_default_construct.cpp
Normal file
@ -0,0 +1,103 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
X();
|
||||
};
|
||||
|
||||
struct Y
|
||||
{
|
||||
Y() = delete;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, std::string> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<std::string> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), std::string() );
|
||||
}
|
||||
|
||||
{
|
||||
variant<std::string const> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), std::string() );
|
||||
}
|
||||
|
||||
{
|
||||
variant<std::string, int, float> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), std::string() );
|
||||
}
|
||||
|
||||
{
|
||||
variant<std::string, std::string, float> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), std::string() );
|
||||
}
|
||||
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_default_constructible<variant<int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_default_constructible<variant<int const>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_default_constructible<variant<int, X>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_default_constructible<variant<int, float, X>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_default_constructible<variant<int, int, X>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_default_constructible<variant<int, X, X>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_default_constructible<variant<X>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_default_constructible<variant<X, int>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_default_constructible<variant<X, int, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_default_constructible<variant<int, Y>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_default_constructible<variant<Y, int>>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
51
test/variant_default_construct_cx.cpp
Normal file
51
test/variant_default_construct_cx.cpp
Normal file
@ -0,0 +1,51 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
constexpr variant<int> v;
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int const> v;
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v;
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float> v;
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, float> v;
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
}
|
205
test/variant_destroy.cpp
Normal file
205
test/variant_destroy.cpp
Normal file
@ -0,0 +1,205 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X1
|
||||
{
|
||||
static int instances;
|
||||
|
||||
int v;
|
||||
|
||||
X1(): v(0) { ++instances; }
|
||||
explicit X1(int v): v(v) { ++instances; }
|
||||
X1(X1 const& r): v(r.v) { ++instances; }
|
||||
X1(X1&& r): v(r.v) { ++instances; }
|
||||
|
||||
~X1() noexcept { --instances; }
|
||||
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
int X1::instances = 0;
|
||||
|
||||
struct X2
|
||||
{
|
||||
static int instances;
|
||||
|
||||
int v;
|
||||
|
||||
X2(): v(0) { ++instances; }
|
||||
explicit X2(int v): v(v) { ++instances; }
|
||||
X2(X2 const& r): v(r.v) { ++instances; }
|
||||
X2(X2&& r): v(r.v) { ++instances; }
|
||||
|
||||
~X2() noexcept { --instances; }
|
||||
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
int X2::instances = 0;
|
||||
|
||||
struct Y1
|
||||
{
|
||||
static int instances;
|
||||
|
||||
int v;
|
||||
|
||||
Y1() noexcept: v(0) { ++instances; }
|
||||
explicit Y1(int v) noexcept: v(v) { ++instances; }
|
||||
Y1(Y1 const& r) noexcept: v(r.v) { ++instances; }
|
||||
Y1(Y1&& r) noexcept: v(r.v) { ++instances; }
|
||||
|
||||
~Y1() noexcept { --instances; }
|
||||
|
||||
Y1& operator=( Y1 const& r ) noexcept { v = r.v; return *this; }
|
||||
Y1& operator=( Y1&& r ) noexcept { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
int Y1::instances = 0;
|
||||
|
||||
struct Y2
|
||||
{
|
||||
static int instances;
|
||||
|
||||
int v;
|
||||
|
||||
Y2() noexcept: v(0) { ++instances; }
|
||||
explicit Y2(int v) noexcept: v(v) { ++instances; }
|
||||
Y2(Y2 const& r) noexcept: v(r.v) { ++instances; }
|
||||
Y2(Y2&& r) noexcept: v(r.v) { ++instances; }
|
||||
|
||||
~Y2() noexcept { --instances; }
|
||||
|
||||
Y2& operator=( Y2 const& r ) noexcept { v = r.v; return *this; }
|
||||
Y2& operator=( Y2&& r ) noexcept { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
int Y2::instances = 0;
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_EQ( Y1::instances, 0 );
|
||||
|
||||
{
|
||||
variant<Y1> v;
|
||||
BOOST_TEST_EQ( Y1::instances, 1 );
|
||||
|
||||
{
|
||||
variant<Y1> v2;
|
||||
BOOST_TEST_EQ( Y1::instances, 2 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( Y1::instances, 2 );
|
||||
}
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 1 );
|
||||
|
||||
v = Y1{1};
|
||||
BOOST_TEST_EQ( Y1::instances, 1 );
|
||||
}
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 0 );
|
||||
BOOST_TEST_EQ( Y2::instances, 0 );
|
||||
|
||||
{
|
||||
variant<Y1, Y2> v;
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 1 );
|
||||
BOOST_TEST_EQ( Y2::instances, 0 );
|
||||
|
||||
{
|
||||
variant<Y1, Y2> v2;
|
||||
BOOST_TEST_EQ( Y1::instances, 2 );
|
||||
BOOST_TEST_EQ( Y2::instances, 0 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( Y1::instances, 2 );
|
||||
BOOST_TEST_EQ( Y2::instances, 0 );
|
||||
|
||||
v2 = Y2{1};
|
||||
BOOST_TEST_EQ( Y1::instances, 1 );
|
||||
BOOST_TEST_EQ( Y2::instances, 1 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( Y1::instances, 0 );
|
||||
BOOST_TEST_EQ( Y2::instances, 2 );
|
||||
}
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 0 );
|
||||
BOOST_TEST_EQ( Y2::instances, 1 );
|
||||
|
||||
v.emplace<0>();
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 1 );
|
||||
BOOST_TEST_EQ( Y2::instances, 0 );
|
||||
|
||||
v.emplace<Y2>();
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 0 );
|
||||
BOOST_TEST_EQ( Y2::instances, 1 );
|
||||
}
|
||||
|
||||
BOOST_TEST_EQ( Y1::instances, 0 );
|
||||
BOOST_TEST_EQ( Y2::instances, 0 );
|
||||
|
||||
BOOST_TEST_EQ( X1::instances, 0 );
|
||||
BOOST_TEST_EQ( X2::instances, 0 );
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
|
||||
BOOST_TEST_EQ( X1::instances, 1 );
|
||||
BOOST_TEST_EQ( X2::instances, 0 );
|
||||
|
||||
{
|
||||
variant<X1, X2> v2;
|
||||
BOOST_TEST_EQ( X1::instances, 2 );
|
||||
BOOST_TEST_EQ( X2::instances, 0 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( X1::instances, 2 );
|
||||
BOOST_TEST_EQ( X2::instances, 0 );
|
||||
|
||||
v2 = X2{1};
|
||||
BOOST_TEST_EQ( X1::instances, 1 );
|
||||
BOOST_TEST_EQ( X2::instances, 1 );
|
||||
|
||||
v = v2;
|
||||
BOOST_TEST_EQ( X1::instances, 0 );
|
||||
BOOST_TEST_EQ( X2::instances, 2 );
|
||||
}
|
||||
|
||||
BOOST_TEST_EQ( X1::instances, 0 );
|
||||
BOOST_TEST_EQ( X2::instances, 1 );
|
||||
|
||||
v.emplace<0>();
|
||||
|
||||
BOOST_TEST_EQ( X1::instances, 1 );
|
||||
BOOST_TEST_EQ( X2::instances, 0 );
|
||||
|
||||
v.emplace<X2>();
|
||||
|
||||
BOOST_TEST_EQ( X1::instances, 0 );
|
||||
BOOST_TEST_EQ( X2::instances, 1 );
|
||||
}
|
||||
|
||||
BOOST_TEST_EQ( X1::instances, 0 );
|
||||
BOOST_TEST_EQ( X2::instances, 0 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
181
test/variant_emplace_index.cpp
Normal file
181
test/variant_emplace_index.cpp
Normal file
@ -0,0 +1,181 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
int v;
|
||||
|
||||
X1(): v(0) {}
|
||||
explicit X1(int v): v(v) {}
|
||||
X1(X1 const& r): v(r.v) {}
|
||||
X1(X1&& r): v(r.v) {}
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
int v;
|
||||
|
||||
X2(): v(0) {}
|
||||
explicit X2(int v): v(v) {}
|
||||
X2(X2 const& r): v(r.v) {}
|
||||
X2(X2&& r): v(r.v) {}
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v.emplace<0>( 1 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v.emplace<0>();
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v.emplace<0>( 1 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v.emplace<1>( 3.14f );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
v.emplace<1>();
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 0 );
|
||||
|
||||
v.emplace<0>();
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v.emplace<0>( 1 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v.emplace<1>();
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 0 );
|
||||
|
||||
v.emplace<1>( 1 );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 1 );
|
||||
|
||||
v.emplace<2>( 3.14f );
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
v.emplace<2>();
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 0 );
|
||||
|
||||
v.emplace<3>( "s1" );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s1") );
|
||||
|
||||
v.emplace<3>( "s2" );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
|
||||
v.emplace<3>();
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string() );
|
||||
|
||||
v.emplace<3>( { 'a', 'b' } );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), (std::string{ 'a', 'b'}) );
|
||||
|
||||
v.emplace<3>( { 'c', 'd' }, std::allocator<char>() );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), (std::string{ 'c', 'd'}) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
v.emplace<0>( 1 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 1 );
|
||||
|
||||
v.emplace<1>( 2 );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 2 );
|
||||
|
||||
v.emplace<0>();
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
v.emplace<0>( 4 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
|
||||
v.emplace<1>();
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 0 );
|
||||
|
||||
v.emplace<1>( 6 );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 6 );
|
||||
|
||||
v.emplace<0>( 3 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 3 );
|
||||
|
||||
v.emplace<0>( 4 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
169
test/variant_emplace_type.cpp
Normal file
169
test/variant_emplace_type.cpp
Normal file
@ -0,0 +1,169 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
int v;
|
||||
|
||||
X1(): v(0) {}
|
||||
explicit X1(int v): v(v) {}
|
||||
X1(X1 const& r): v(r.v) {}
|
||||
X1(X1&& r): v(r.v) {}
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
int v;
|
||||
|
||||
X2(): v(0) {}
|
||||
explicit X2(int v): v(v) {}
|
||||
X2(X2 const& r): v(r.v) {}
|
||||
X2(X2&& r): v(r.v) {}
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v.emplace<int>( 1 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v.emplace<int>();
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v.emplace<int>( 1 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v.emplace<float>( 3.14f );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
v.emplace<float>();
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 0 );
|
||||
|
||||
v.emplace<int>();
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v.emplace<float>( 3.14f );
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
v.emplace<float>();
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 0 );
|
||||
|
||||
v.emplace<std::string>( "s1" );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s1") );
|
||||
|
||||
v.emplace<std::string>( "s2" );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
|
||||
v.emplace<std::string>();
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string() );
|
||||
|
||||
v.emplace<std::string>( { 'a', 'b' } );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), (std::string{ 'a', 'b' }) );
|
||||
|
||||
v.emplace<std::string>( { 'c', 'd' }, std::allocator<char>() );
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), (std::string{ 'c', 'd' }) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
v.emplace<X1>( 1 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 1 );
|
||||
|
||||
v.emplace<X2>( 2 );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 2 );
|
||||
|
||||
v.emplace<X1>();
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
v.emplace<X1>( 4 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
|
||||
v.emplace<X2>();
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 0 );
|
||||
|
||||
v.emplace<X2>( 6 );
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 6 );
|
||||
|
||||
v.emplace<X1>( 3 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 3 );
|
||||
|
||||
v.emplace<X1>( 4 );
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
92
test/variant_eq_ne.cpp
Normal file
92
test/variant_eq_ne.cpp
Normal file
@ -0,0 +1,92 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
};
|
||||
|
||||
inline bool operator==( X const&, X const& ) { return false; }
|
||||
inline bool operator!=( X const&, X const& ) { return false; }
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v1, v2, v3( 1 ), v4( 1 );
|
||||
|
||||
BOOST_TEST( v1 == v2 );
|
||||
BOOST_TEST_NOT( v1 != v2 );
|
||||
|
||||
BOOST_TEST( v1 != v3 );
|
||||
BOOST_TEST_NOT( v1 == v3 );
|
||||
|
||||
BOOST_TEST( v3 == v4 );
|
||||
BOOST_TEST_NOT( v3 != v4 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v1, v2, v3( 1 ), v4( 1 ), v5( 3.14f ), v6( 3.14f );
|
||||
|
||||
BOOST_TEST( v1 == v2 );
|
||||
BOOST_TEST_NOT( v1 != v2 );
|
||||
|
||||
BOOST_TEST( v1 != v3 );
|
||||
BOOST_TEST_NOT( v1 == v3 );
|
||||
|
||||
BOOST_TEST( v3 == v4 );
|
||||
BOOST_TEST_NOT( v3 != v4 );
|
||||
|
||||
BOOST_TEST( v1 != v5 );
|
||||
BOOST_TEST_NOT( v1 == v5 );
|
||||
|
||||
BOOST_TEST( v3 != v5 );
|
||||
BOOST_TEST_NOT( v3 == v5 );
|
||||
|
||||
BOOST_TEST( v5 == v6 );
|
||||
BOOST_TEST_NOT( v5 != v6 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float> v1, v2, v3( in_place_index<1> ), v4( in_place_index<1> ), v5( 3.14f ), v6( 3.14f );
|
||||
|
||||
BOOST_TEST( v1 == v2 );
|
||||
BOOST_TEST_NOT( v1 != v2 );
|
||||
|
||||
BOOST_TEST( v1 != v3 );
|
||||
BOOST_TEST_NOT( v1 == v3 );
|
||||
|
||||
BOOST_TEST( v3 == v4 );
|
||||
BOOST_TEST_NOT( v3 != v4 );
|
||||
|
||||
BOOST_TEST( v1 != v5 );
|
||||
BOOST_TEST_NOT( v1 == v5 );
|
||||
|
||||
BOOST_TEST( v3 != v5 );
|
||||
BOOST_TEST_NOT( v3 == v5 );
|
||||
|
||||
BOOST_TEST( v5 == v6 );
|
||||
BOOST_TEST_NOT( v5 != v6 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X> v1, v2;
|
||||
|
||||
BOOST_TEST_NOT( v1 == v2 );
|
||||
BOOST_TEST_NOT( v1 != v2 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
200
test/variant_get_by_index.cpp
Normal file
200
test/variant_get_by_index.cpp
Normal file
@ -0,0 +1,200 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int volatile> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const volatile&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const volatile&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const volatile*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> 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<int> 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<int, float> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float const*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const, float volatile> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float volatile&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float volatile&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float volatile*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const, float volatile> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float const volatile&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float const volatile&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float const volatile*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> 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<int, float> 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<int, float> 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<int, float, float> 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<int, float, float> 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<int, int, float> 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 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
90
test/variant_get_by_index_cx.cpp
Normal file
90
test/variant_get_by_index_cx.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
constexpr variant<int> v;
|
||||
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
STATIC_ASSERT( get_if<0>(&v) == &get<0>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int> v( 1 );
|
||||
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
STATIC_ASSERT( get_if<0>(&v) == &get<0>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v;
|
||||
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
STATIC_ASSERT( get_if<0>(&v) == &get<0>(v) );
|
||||
|
||||
STATIC_ASSERT( get_if<1>(&v) == nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( 1 );
|
||||
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
STATIC_ASSERT( get_if<0>(&v) == &get<0>(v) );
|
||||
|
||||
STATIC_ASSERT( get_if<1>(&v) == nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( 3.14f );
|
||||
|
||||
STATIC_ASSERT( get_if<0>(&v) == nullptr );
|
||||
|
||||
STATIC_ASSERT( get<1>(v) == 3.14f );
|
||||
STATIC_ASSERT( get_if<1>(&v) == &get<1>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, float> v;
|
||||
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
STATIC_ASSERT( get_if<0>(&v) == &get<0>(v) );
|
||||
|
||||
STATIC_ASSERT( get_if<1>(&v) == nullptr );
|
||||
|
||||
STATIC_ASSERT( get_if<2>(&v) == nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, float> v( 1 );
|
||||
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
STATIC_ASSERT( get_if<0>(&v) == &get<0>(v) );
|
||||
|
||||
STATIC_ASSERT( get_if<1>(&v) == nullptr );
|
||||
|
||||
STATIC_ASSERT( get_if<2>(&v) == nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float> v( 3.14f );
|
||||
|
||||
STATIC_ASSERT( get_if<0>(&v) == nullptr );
|
||||
|
||||
STATIC_ASSERT( get_if<1>(&v) == nullptr );
|
||||
|
||||
STATIC_ASSERT( get<2>(v) == 3.14f );
|
||||
STATIC_ASSERT( get_if<2>(&v) == &get<2>(v) );
|
||||
}
|
||||
}
|
166
test/variant_get_by_type.cpp
Normal file
166
test/variant_get_by_type.cpp
Normal file
@ -0,0 +1,166 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(v)), int&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(std::move(v))), int&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int>(&v)), int*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int>(&v)), int const*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int const>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int const>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int const>(&v)), int const*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int volatile> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int volatile>(v)), int const volatile&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int volatile>(std::move(v))), int const volatile&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int volatile>(&v)), int const volatile*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> v;
|
||||
|
||||
BOOST_TEST_EQ( get<int>(v), 0 );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( get<int>(v), 1 );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(v)), int&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(std::move(v))), int&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int>(&v)), int*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float>(v)), float&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float>(std::move(v))), float&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<float>(&v)), float*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int>(&v)), int const*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float>(v)), float const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float>(std::move(v))), float const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<float>(&v)), float const*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const, float volatile> v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int const>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int const>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int const>(&v)), int const*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float volatile>(v)), float volatile&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float volatile>(std::move(v))), float volatile&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<float volatile>(&v)), float volatile*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const, float volatile> const v;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int const>(v)), int const&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<int const>(std::move(v))), int const&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<int const>(&v)), int const*>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float volatile>(v)), float const volatile&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<float volatile>(std::move(v))), float const volatile&&>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<float volatile>(&v)), float const volatile*>));
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
|
||||
BOOST_TEST_EQ( get<int>(v), 0 );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), &get<int>(v) );
|
||||
|
||||
BOOST_TEST_THROWS( get<float>(v), bad_variant_access );
|
||||
BOOST_TEST_EQ( get_if<float>(&v), nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( get<int>(v), 1 );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), &get<int>(v) );
|
||||
|
||||
BOOST_TEST_THROWS( get<float>(v), bad_variant_access );
|
||||
BOOST_TEST_EQ( get_if<float>(&v), nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( 3.14f );
|
||||
|
||||
BOOST_TEST_THROWS( get<int>(v), bad_variant_access );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), nullptr );
|
||||
|
||||
BOOST_TEST_EQ( get<float>(v), 3.14f );
|
||||
BOOST_TEST_EQ( get_if<float>(&v), &get<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, float> v;
|
||||
|
||||
BOOST_TEST_EQ( get<int>(v), 0 );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, float> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( get<int>(v), 1 );
|
||||
BOOST_TEST_EQ( get_if<int>(&v), &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float> v( 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( get<float>(v), 3.14f );
|
||||
BOOST_TEST_EQ( get_if<float>(&v), &get<float>(v) );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
78
test/variant_get_by_type_cx.cpp
Normal file
78
test/variant_get_by_type_cx.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
constexpr variant<int> v;
|
||||
|
||||
STATIC_ASSERT( get<int>(v) == 0 );
|
||||
STATIC_ASSERT( get_if<int>(&v) == &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int> v( 1 );
|
||||
|
||||
STATIC_ASSERT( get<int>(v) == 1 );
|
||||
STATIC_ASSERT( get_if<int>(&v) == &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v;
|
||||
|
||||
STATIC_ASSERT( get<int>(v) == 0 );
|
||||
STATIC_ASSERT( get_if<int>(&v) == &get<int>(v) );
|
||||
|
||||
STATIC_ASSERT( get_if<float>(&v) == nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( 1 );
|
||||
|
||||
STATIC_ASSERT( get<int>(v) == 1 );
|
||||
STATIC_ASSERT( get_if<int>(&v) == &get<int>(v) );
|
||||
|
||||
STATIC_ASSERT( get_if<float>(&v) == nullptr );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( 3.14f );
|
||||
|
||||
STATIC_ASSERT( get_if<int>(&v) == nullptr );
|
||||
|
||||
STATIC_ASSERT( get<float>(v) == 3.14f );
|
||||
STATIC_ASSERT( get_if<float>(&v) == &get<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, float> v;
|
||||
|
||||
STATIC_ASSERT( get<int>(v) == 0 );
|
||||
STATIC_ASSERT( get_if<int>(&v) == &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, float> v( 1 );
|
||||
|
||||
STATIC_ASSERT( get<int>(v) == 1 );
|
||||
STATIC_ASSERT( get_if<int>(&v) == &get<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float> v( 3.14f );
|
||||
|
||||
STATIC_ASSERT( get<float>(v) == 3.14f );
|
||||
STATIC_ASSERT( get_if<float>(&v) == &get<float>(v) );
|
||||
}
|
||||
}
|
78
test/variant_holds_alternative.cpp
Normal file
78
test/variant_holds_alternative.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST( holds_alternative<int>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
BOOST_TEST( holds_alternative<int>( v ) );
|
||||
BOOST_TEST( !holds_alternative<float>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( 3.14f );
|
||||
BOOST_TEST( !holds_alternative<int>( v ) );
|
||||
BOOST_TEST( holds_alternative<float>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, float> v;
|
||||
BOOST_TEST( holds_alternative<int>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float> v( 3.14f );
|
||||
BOOST_TEST( holds_alternative<float>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v;
|
||||
BOOST_TEST( holds_alternative<int>( v ) );
|
||||
BOOST_TEST( !holds_alternative<float>( v ) );
|
||||
BOOST_TEST( !holds_alternative<std::string>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( 3.14f );
|
||||
BOOST_TEST( !holds_alternative<int>( v ) );
|
||||
BOOST_TEST( holds_alternative<float>( v ) );
|
||||
BOOST_TEST( !holds_alternative<std::string>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( "text" );
|
||||
BOOST_TEST( !holds_alternative<int>( v ) );
|
||||
BOOST_TEST( !holds_alternative<float>( v ) );
|
||||
BOOST_TEST( holds_alternative<std::string>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v( 3.14f );
|
||||
BOOST_TEST( holds_alternative<float>( v ) );
|
||||
BOOST_TEST( !holds_alternative<std::string>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v( "text" );
|
||||
BOOST_TEST( !holds_alternative<float>( v ) );
|
||||
BOOST_TEST( holds_alternative<std::string>( v ) );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
43
test/variant_holds_alternative_cx.cpp
Normal file
43
test/variant_holds_alternative_cx.cpp
Normal file
@ -0,0 +1,43 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
constexpr variant<int> v;
|
||||
STATIC_ASSERT( holds_alternative<int>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v;
|
||||
STATIC_ASSERT( holds_alternative<int>( v ) );
|
||||
STATIC_ASSERT( !holds_alternative<float>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( 3.14f );
|
||||
STATIC_ASSERT( !holds_alternative<int>( v ) );
|
||||
STATIC_ASSERT( holds_alternative<float>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, float> v;
|
||||
STATIC_ASSERT( holds_alternative<int>( v ) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float> v( 3.14f );
|
||||
STATIC_ASSERT( holds_alternative<float>( v ) );
|
||||
}
|
||||
}
|
138
test/variant_in_place_index_construct.cpp
Normal file
138
test/variant_in_place_index_construct.cpp
Normal file
@ -0,0 +1,138 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
X() = default;
|
||||
X( in_place_index_t<0> ) = delete;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v( in_place_index<0> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X> v( in_place_index<0> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> v( in_place_index<0>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_index<0> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_index<0>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_index<1> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 0 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_index<1>, 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<0>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<1>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<2>, 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<3>, 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<4>, "text" );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 4 );
|
||||
BOOST_TEST_EQ( get<4>(v), std::string("text") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<5>, "text" );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 5 );
|
||||
BOOST_TEST_EQ( get<5>(v), std::string("text") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<5>, 4, 'a' );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 5 );
|
||||
BOOST_TEST_EQ( get<5>(v), std::string( 4, 'a' ) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<4>, { 'a', 'b', 'c' } );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 4 );
|
||||
BOOST_TEST_EQ( get<4>(v), (std::string{ 'a', 'b', 'c' }) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string, std::string> v( in_place_index<5>, { 'a', 'b', 'c' }, std::allocator<char>() );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 5 );
|
||||
BOOST_TEST_EQ( get<5>(v), (std::string{ 'a', 'b', 'c' }) );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
116
test/variant_in_place_index_construct_cx.cpp
Normal file
116
test/variant_in_place_index_construct_cx.cpp
Normal file
@ -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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
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<int> v( in_place_index<0> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<X> v( in_place_index<0> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int> v( in_place_index<0>, 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_index<0> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_index<0>, 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_index<1> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 1 );
|
||||
STATIC_ASSERT( get<1>(v) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_index<1>, 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 1 );
|
||||
STATIC_ASSERT( get<1>(v) == 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X, X> v( in_place_index<0>, 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X, X> v( in_place_index<1>, 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 1 );
|
||||
STATIC_ASSERT( get<1>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X, X> v( in_place_index<2>, 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 2 );
|
||||
STATIC_ASSERT( get<2>(v) == 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X, X> v( in_place_index<3>, 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 3 );
|
||||
STATIC_ASSERT( get<3>(v) == 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X, X> v( in_place_index<4> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 4 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X, X> v( in_place_index<5>, 0, 0 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 5 );
|
||||
}
|
||||
}
|
134
test/variant_in_place_type_construct.cpp
Normal file
134
test/variant_in_place_type_construct.cpp
Normal file
@ -0,0 +1,134 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
X() = default;
|
||||
template<class T> X( in_place_type_t<T> ) = delete;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v( in_place_type<int> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X> v( in_place_type<X> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
|
||||
BOOST_TEST( holds_alternative<X>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> v( in_place_type<int>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_type<int> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_type<int>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_type<float> );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 0 );
|
||||
|
||||
BOOST_TEST( holds_alternative<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v( in_place_type<float>, 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
BOOST_TEST( holds_alternative<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v( in_place_type<float>, 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
BOOST_TEST( holds_alternative<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string> v( in_place_type<std::string>, "text" );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 4 );
|
||||
BOOST_TEST_EQ( get<4>(v), std::string("text") );
|
||||
|
||||
BOOST_TEST( holds_alternative<std::string>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string> v( in_place_type<std::string>, 4, 'a' );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 4 );
|
||||
BOOST_TEST_EQ( get<4>(v), std::string( 4, 'a' ) );
|
||||
|
||||
BOOST_TEST( holds_alternative<std::string>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string> v( in_place_type<std::string>, { 'a', 'b', 'c' } );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 4 );
|
||||
BOOST_TEST_EQ( get<4>(v), (std::string{ 'a', 'b', 'c' }) );
|
||||
|
||||
BOOST_TEST( holds_alternative<std::string>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, float, std::string> v( in_place_type<std::string>, { 'a', 'b', 'c' }, std::allocator<char>() );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 4 );
|
||||
BOOST_TEST_EQ( get<4>(v), (std::string{ 'a', 'b', 'c' }) );
|
||||
|
||||
BOOST_TEST( holds_alternative<std::string>(v) );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
110
test/variant_in_place_type_construct_cx.cpp
Normal file
110
test/variant_in_place_type_construct_cx.cpp
Normal file
@ -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 <boost/variant2/variant.hpp>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
constexpr X() = default;
|
||||
constexpr explicit X(int, int) {}
|
||||
template<class T> X( in_place_type_t<T> ) = delete;
|
||||
};
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
constexpr variant<int> v( in_place_type<int> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<X> v( in_place_type<X> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<X>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int> v( in_place_type<int>, 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_type<int> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 0 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_type<int>, 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<int>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_type<float> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 1 );
|
||||
STATIC_ASSERT( get<1>(v) == 0 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float> v( in_place_type<float>, 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 1 );
|
||||
STATIC_ASSERT( get<1>(v) == 3.14f );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, X> v( in_place_type<float>, 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 2 );
|
||||
STATIC_ASSERT( get<2>(v) == 3.14f );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<float>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X> v( in_place_type<X> );
|
||||
|
||||
STATIC_ASSERT( v.index() == 4 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<X>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, float, X> v( in_place_type<X>, 0, 0 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 4 );
|
||||
|
||||
STATIC_ASSERT( holds_alternative<X>(v) );
|
||||
}
|
||||
}
|
194
test/variant_move_assign.cpp
Normal file
194
test/variant_move_assign.cpp
Normal file
@ -0,0 +1,194 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
int v;
|
||||
|
||||
X1(): v(0) {}
|
||||
explicit X1(int v): v(v) {}
|
||||
X1(X1 const& r): v(r.v) {}
|
||||
X1(X1&& r): v(r.v) {}
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
int v;
|
||||
|
||||
X2(): v(0) {}
|
||||
explicit X2(int v): v(v) {}
|
||||
X2(X2 const& r): v(r.v) {}
|
||||
X2(X2&& r): v(r.v) {}
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
|
||||
|
||||
struct Y
|
||||
{
|
||||
Y& operator=( Y&& ) = delete;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int> v2( 1 );
|
||||
|
||||
v = std::move(v2);
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
variant<int> v3( 2 );
|
||||
|
||||
v = std::move(v3);
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int, float> v2( 1 );
|
||||
|
||||
v = std::move(v2);
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
variant<int, float> v3( 3.14f );
|
||||
|
||||
v = std::move(v3);
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
variant<int, float> v4( 3.15f );
|
||||
|
||||
v = std::move(v4);
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.15f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int, int, float, std::string> v2( in_place_index<1>, 1 );
|
||||
|
||||
v = std::move(v2);
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 1 );
|
||||
|
||||
variant<int, int, float, std::string> v3( 3.14f );
|
||||
|
||||
v = std::move(v3);
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
variant<int, int, float, std::string> v4( 3.15f );
|
||||
|
||||
v = std::move(v4);
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.15f );
|
||||
|
||||
variant<int, int, float, std::string> v5( "s1" );
|
||||
|
||||
v = std::move(v5);
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s1") );
|
||||
|
||||
variant<int, int, float, std::string> v6( "s2" );
|
||||
|
||||
v = std::move(v6);
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
variant<X1, X2> v2( X1{1} );
|
||||
|
||||
v = std::move(v2);
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 1 );
|
||||
|
||||
variant<X1, X2> v3( in_place_index<1>, 2 );
|
||||
|
||||
v = std::move(v3);
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 2 );
|
||||
|
||||
variant<X1, X2> v4( in_place_index<1>, 3 );
|
||||
|
||||
v = std::move(v4);
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 3 );
|
||||
|
||||
variant<X1, X2> v5( in_place_index<0>, 4 );
|
||||
|
||||
v = std::move(v5);
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
}
|
||||
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_assignable<variant<int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_assignable<variant<int, int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_assignable<variant<int, float>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_assignable<variant<int, int, float, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<X1, int>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<X1, int, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<int, X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<int, int, X1>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_assignable<variant<X1, X2, int, int>>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_move_assignable<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_move_assignable<variant<int const>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_move_assignable<variant<int, float, Y>>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
129
test/variant_move_construct.cpp
Normal file
129
test/variant_move_construct.cpp
Normal file
@ -0,0 +1,129 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
X1() {}
|
||||
X1(X1 const&) {}
|
||||
X1(X1&&) {}
|
||||
};
|
||||
|
||||
inline bool operator==( X1, X1 ) { return true; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
X2() {}
|
||||
X2(X2 const&) {}
|
||||
X2(X2&&) {}
|
||||
};
|
||||
|
||||
inline bool operator==( X2, X2 ) { return true; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
|
||||
struct Y
|
||||
{
|
||||
Y( Y&& ) = delete;
|
||||
};
|
||||
|
||||
template<class V> static void test( V&& v )
|
||||
{
|
||||
V v2( v );
|
||||
V v3( std::move(v) );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), v3.index() );
|
||||
BOOST_TEST( v2 == v3 );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test( variant<int>() );
|
||||
test( variant<int>(1) );
|
||||
|
||||
test( variant<int const>() );
|
||||
test( variant<int const>(1) );
|
||||
|
||||
test( variant<int, float>() );
|
||||
test( variant<int, float>(1) );
|
||||
test( variant<int, float>(3.14f) );
|
||||
|
||||
test( variant<int, float, std::string>() );
|
||||
test( variant<int, float, std::string>(1) );
|
||||
test( variant<int, float, std::string>(3.14f) );
|
||||
test( variant<int, float, std::string>("test") );
|
||||
|
||||
test( variant<int, int>() );
|
||||
|
||||
test( variant<int, int, float>() );
|
||||
test( variant<int, int, float>(3.14f) );
|
||||
|
||||
test( variant<int, int, float, float>() );
|
||||
|
||||
test( variant<int, int, float, float, std::string>("test") );
|
||||
|
||||
test( variant<std::string, std::string, float>() );
|
||||
|
||||
test( variant<X1, X2>() );
|
||||
test( variant<X1, X2, int>() );
|
||||
test( variant<X1, X2, X2>() );
|
||||
test( variant<X1, X1, X2, X2>() );
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
v.emplace<X2>();
|
||||
|
||||
test( std::move(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X1, X2> v;
|
||||
v.emplace<X2>();
|
||||
|
||||
test( std::move(v) );
|
||||
}
|
||||
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_constructible<variant<int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_constructible<variant<int const>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_constructible<variant<int, int>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_constructible<variant<int, float>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_nothrow_move_constructible<variant<int, int, float, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<X1, int>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<X1, int, float>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<int, X1>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<int, int, X1>>));
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_nothrow_move_constructible<variant<X1, X2, int, int>>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_move_constructible<variant<X1, X2>>));
|
||||
BOOST_TEST_TRAIT_FALSE((std::is_move_constructible<variant<int, float, Y>>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
64
test/variant_size.cpp
Normal file
64
test/variant_size.cpp
Normal file
@ -0,0 +1,64 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/mp11.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <cstddef>
|
||||
|
||||
using namespace boost::variant2;
|
||||
using namespace boost::mp11;
|
||||
|
||||
template<class T> using var_size_t = mp_size_t<variant_size<T>::value>;
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_EQ( (variant_size<variant<>>::value), 0 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<> const>::value), 0 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<> volatile>::value), 0 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<> const volatile>::value), 0 );
|
||||
|
||||
BOOST_TEST_EQ( (variant_size<variant<void>>::value), 1 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void> const>::value), 1 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void> volatile>::value), 1 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void> const volatile>::value), 1 );
|
||||
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void>>::value), 2 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void> const>::value), 2 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void> volatile>::value), 2 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void> const volatile>::value), 2 );
|
||||
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void>>::value), 3 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void> const>::value), 3 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void> volatile>::value), 3 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void> const volatile>::value), 3 );
|
||||
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void, void>>::value), 4 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> const>::value), 4 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> volatile>::value), 4 );
|
||||
BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> const volatile>::value), 4 );
|
||||
|
||||
variant_size<void>();
|
||||
variant_size<void const>();
|
||||
variant_size<void volatile>();
|
||||
variant_size<void const volatile>();
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void const>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void volatile>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void const volatile>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<>>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> const>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> volatile>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> const volatile>));
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
259
test/variant_swap.cpp
Normal file
259
test/variant_swap.cpp
Normal file
@ -0,0 +1,259 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
int v;
|
||||
|
||||
X1(): v(0) {}
|
||||
explicit X1(int v): v(v) {}
|
||||
X1(X1 const& r): v(r.v) {}
|
||||
X1(X1&& r): v(r.v) {}
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
int v;
|
||||
|
||||
X2(): v(0) {}
|
||||
explicit X2(int v): v(v) {}
|
||||
X2(X2 const& r): v(r.v) {}
|
||||
X2(X2&& r): v(r.v) {}
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int> v2( 1 );
|
||||
BOOST_TEST_EQ( get<0>(v2), 1 );
|
||||
|
||||
swap( v, v2 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
BOOST_TEST_EQ( get<0>(v2), 0 );
|
||||
|
||||
variant<int> v3( 2 );
|
||||
BOOST_TEST_EQ( get<0>(v3), 2 );
|
||||
|
||||
swap( v, v3 );
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
BOOST_TEST_EQ( get<0>(v3), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int, float> v2( 1 );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v2), 1 );
|
||||
|
||||
swap( v, v2 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v2), 0 );
|
||||
|
||||
variant<int, float> v3( 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v3.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v3), 3.14f );
|
||||
|
||||
swap( v, v3 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v3.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v3), 1 );
|
||||
|
||||
variant<int, float> v4( 3.15f );
|
||||
|
||||
BOOST_TEST_EQ( v4.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v4), 3.15f );
|
||||
|
||||
swap( v, v4 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.15f );
|
||||
|
||||
BOOST_TEST_EQ( v4.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v4), 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
variant<int, int, float, std::string> v2( in_place_index<1>, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v2), 1 );
|
||||
|
||||
swap( v, v2 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 1 );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v2), 0 );
|
||||
|
||||
variant<int, int, float, std::string> v3( 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v3.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v3), 3.14f );
|
||||
|
||||
swap( v, v3 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v3.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v3), 1 );
|
||||
|
||||
variant<int, int, float, std::string> v4( 3.15f );
|
||||
|
||||
BOOST_TEST_EQ( v4.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v4), 3.15f );
|
||||
|
||||
swap( v, v4 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.15f );
|
||||
|
||||
BOOST_TEST_EQ( v4.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v4), 3.14f );
|
||||
|
||||
variant<int, int, float, std::string> v5( "s1" );
|
||||
|
||||
BOOST_TEST_EQ( v5.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v5), std::string("s1") );
|
||||
|
||||
swap( v, v5 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s1") );
|
||||
|
||||
BOOST_TEST_EQ( v5.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v5), 3.15f );
|
||||
|
||||
variant<int, int, float, std::string> v6( "s2" );
|
||||
|
||||
BOOST_TEST_EQ( v6.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v6), std::string("s2") );
|
||||
|
||||
swap( v, v6 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
|
||||
BOOST_TEST_EQ( v6.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v6), std::string("s1") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
variant<X1, X2> v2( X1{1} );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v2).v, 1 );
|
||||
|
||||
swap( v, v2 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 1 );
|
||||
|
||||
BOOST_TEST_EQ( v2.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v2).v, 0 );
|
||||
|
||||
variant<X1, X2> v3( in_place_index<1>, 2 );
|
||||
|
||||
BOOST_TEST_EQ( v3.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v3).v, 2 );
|
||||
|
||||
swap( v, v3 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 2 );
|
||||
|
||||
BOOST_TEST_EQ( v3.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v3).v, 1 );
|
||||
|
||||
variant<X1, X2> v4( in_place_index<1>, 3 );
|
||||
|
||||
BOOST_TEST_EQ( v4.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v4).v, 3 );
|
||||
|
||||
swap( v, v4 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 3 );
|
||||
|
||||
BOOST_TEST_EQ( v4.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v4).v, 2 );
|
||||
|
||||
variant<X1, X2> v5( in_place_index<0>, 4 );
|
||||
|
||||
BOOST_TEST_EQ( v5.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v5).v, 4 );
|
||||
|
||||
swap( v, v5 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
|
||||
BOOST_TEST_EQ( v5.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v5).v, 3 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
206
test/variant_value_assign.cpp
Normal file
206
test/variant_value_assign.cpp
Normal file
@ -0,0 +1,206 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
struct X1
|
||||
{
|
||||
int v;
|
||||
|
||||
X1(): v(0) {}
|
||||
explicit X1(int v): v(v) {}
|
||||
X1(X1 const& r): v(r.v) {}
|
||||
X1(X1&& r): v(r.v) {}
|
||||
X1& operator=( X1 const& r ) { v = r.v; return *this; }
|
||||
X1& operator=( X1&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
|
||||
|
||||
struct X2
|
||||
{
|
||||
int v;
|
||||
|
||||
X2(): v(0) {}
|
||||
explicit X2(int v): v(v) {}
|
||||
X2(X2 const& r): v(r.v) {}
|
||||
X2(X2&& r): v(r.v) {}
|
||||
X2& operator=( X2 const& r ) { v = r.v; return *this; }
|
||||
X2& operator=( X2&& r ) { v = r.v; return *this; }
|
||||
};
|
||||
|
||||
inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
|
||||
|
||||
STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
|
||||
STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v;
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v = 1;
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v = 2;
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
|
||||
int w1 = 3;
|
||||
|
||||
v = w1;
|
||||
BOOST_TEST_EQ( get<0>(v), 3 );
|
||||
|
||||
int const w2 = 4;
|
||||
|
||||
v = w2;
|
||||
BOOST_TEST_EQ( get<0>(v), 4 );
|
||||
|
||||
v = std::move( w1 );
|
||||
BOOST_TEST_EQ( get<0>(v), 3 );
|
||||
|
||||
v = std::move( w2 );
|
||||
BOOST_TEST_EQ( get<0>(v), 4 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v = 1;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
|
||||
v = 3.14f;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
|
||||
float w1 = 3.15f;
|
||||
|
||||
v = w1;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.15f );
|
||||
|
||||
int const w2 = 2;
|
||||
|
||||
v = w2;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
|
||||
v = std::move(w1);
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.15f );
|
||||
|
||||
v = std::move(w2);
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 0 );
|
||||
|
||||
v = 3.14f;
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
|
||||
float const w1 = 3.15f;
|
||||
|
||||
v = w1;
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.15f );
|
||||
|
||||
variant<int, int, float, std::string> v5( "s1" );
|
||||
|
||||
v = "s1";
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s1") );
|
||||
|
||||
std::string w2( "s2" );
|
||||
|
||||
v = w2;
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
|
||||
v = std::move(w1);
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.15f );
|
||||
|
||||
v = std::move(w2);
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("s2") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<X1, X2> v;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 0 );
|
||||
|
||||
v = X1{1};
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 1 );
|
||||
|
||||
v = X2{2};
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 2 );
|
||||
|
||||
X1 w1{3};
|
||||
|
||||
v = w1;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 3 );
|
||||
|
||||
X1 const w2{4};
|
||||
|
||||
v = w2;
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
|
||||
X2 w3{5};
|
||||
|
||||
v = w3;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 5 );
|
||||
|
||||
X2 const w4{6};
|
||||
|
||||
v = w4;
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST_EQ( get<1>(v).v, 6 );
|
||||
|
||||
v = std::move(w1);
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 3 );
|
||||
|
||||
v = std::move(w2);
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v).v, 4 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
124
test/variant_value_construct.cpp
Normal file
124
test/variant_value_construct.cpp
Normal file
@ -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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
operator int() const { return 2; }
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> v( 'a' );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 'a' );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> v( X{} );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v( 'a' );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 'a' );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v( X{} );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
BOOST_TEST_EQ( get<0>(v), 1 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( 'a' );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
BOOST_TEST_EQ( get<0>(v), 'a' );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( X{} );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 0 );
|
||||
BOOST_TEST( holds_alternative<int>(v) );
|
||||
BOOST_TEST_EQ( get<0>(v), 2 );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 1 );
|
||||
BOOST_TEST( holds_alternative<float>(v) );
|
||||
BOOST_TEST_EQ( get<1>(v), 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, std::string> v( "text" );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST( holds_alternative<std::string>(v) );
|
||||
BOOST_TEST_EQ( get<2>(v), std::string("text") );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v( 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 2 );
|
||||
BOOST_TEST( holds_alternative<float>(v) );
|
||||
BOOST_TEST_EQ( get<2>(v), 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, int, float, std::string> v( "text" );
|
||||
|
||||
BOOST_TEST_EQ( v.index(), 3 );
|
||||
BOOST_TEST( holds_alternative<std::string>(v) );
|
||||
BOOST_TEST_EQ( get<3>(v), std::string("text") );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
109
test/variant_value_construct_cx.cpp
Normal file
109
test/variant_value_construct_cx.cpp
Normal file
@ -0,0 +1,109 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
struct X
|
||||
{
|
||||
constexpr operator int() const { return 2; }
|
||||
};
|
||||
|
||||
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
constexpr variant<int> v( 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int> v( 'a' );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 'a' );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int> v( X{} );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 2 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int const> v( 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int const> v( 'a' );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 'a' );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int const> v( X{} );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( get<0>(v) == 2 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, X> v( 1 );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( holds_alternative<int>(v) );
|
||||
STATIC_ASSERT( get<0>(v) == 1 );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, X> v( 'a' );
|
||||
|
||||
STATIC_ASSERT( v.index() == 0 );
|
||||
STATIC_ASSERT( holds_alternative<int>(v) );
|
||||
STATIC_ASSERT( get<0>(v) == 'a' );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, X> v( 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 1 );
|
||||
STATIC_ASSERT( holds_alternative<float>(v) );
|
||||
STATIC_ASSERT( get<1>(v) == 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, float, X> v( X{} );
|
||||
|
||||
STATIC_ASSERT( v.index() == 2 );
|
||||
STATIC_ASSERT( holds_alternative<X>(v) );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, X> v( 3.14f );
|
||||
|
||||
STATIC_ASSERT( v.index() == 2 );
|
||||
STATIC_ASSERT( holds_alternative<float>(v) );
|
||||
STATIC_ASSERT( get<2>(v) == 3.14f );
|
||||
}
|
||||
|
||||
{
|
||||
constexpr variant<int, int, float, X> v( X{} );
|
||||
|
||||
STATIC_ASSERT( v.index() == 3 );
|
||||
STATIC_ASSERT( holds_alternative<X>(v) );
|
||||
}
|
||||
}
|
91
test/variant_visit.cpp
Normal file
91
test/variant_visit.cpp
Normal file
@ -0,0 +1,91 @@
|
||||
|
||||
// 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 <boost/variant2/variant.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
#include <cstdio>
|
||||
|
||||
using namespace boost::variant2;
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
variant<int> v( 1 );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x ){ return x; }, v )), 1 );
|
||||
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 1 ); }, v );
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 1 ); }, std::move(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int> const v( 2 );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x ){ return x; }, v )), 2 );
|
||||
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 2 ); }, v );
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 2 ); }, std::move(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> v( 3 );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x ){ return x; }, v )), 3 );
|
||||
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 3 ); }, v );
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 3 ); }, std::move(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int const> const v( 4 );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x ){ return x; }, v )), 4 );
|
||||
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 4 ); }, v );
|
||||
visit( []( auto x ){ BOOST_TEST_EQ( x, 4 ); }, std::move(v) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float> v1( 1 );
|
||||
variant<int, float> const v2( 3.14f );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x1, auto x2 ){ return (int)(x1 * 1000) + (int)(x2 * 100); }, v1, v2 )), 1314 );
|
||||
|
||||
visit( []( auto x1, auto x2 ){ BOOST_TEST_EQ( x1, 1 ); BOOST_TEST_EQ( x2, 3.14f ); }, v1, v2 );
|
||||
visit( []( auto x1, auto x2 ){ BOOST_TEST_EQ( x1, 1 ); BOOST_TEST_EQ( x2, 3.14f ); }, std::move(v1), std::move(v2) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, double> v1( 1 );
|
||||
variant<int, float, double> const v2( 3.14f );
|
||||
variant<int, float, double> v3( 6.28 );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x1, auto x2, auto x3 ){ return (int)(x1 * 100) * 1000000 + (int)(x2 * 100) * 1000 + (int)(x3 * 100); }, v1, v2, v3 )), 100314628 );
|
||||
|
||||
visit( []( auto x1, auto x2, auto x3 ){ BOOST_TEST_EQ( x1, 1 ); BOOST_TEST_EQ( x2, 3.14f ); BOOST_TEST_EQ( x3, 6.28 ); }, v1, v2, v3 );
|
||||
visit( []( auto x1, auto x2, auto x3 ){ BOOST_TEST_EQ( x1, 1 ); BOOST_TEST_EQ( x2, 3.14f ); BOOST_TEST_EQ( x3, 6.28 ); }, std::move(v1), std::move(v2), std::move(v3) );
|
||||
}
|
||||
|
||||
{
|
||||
variant<int, float, double, char> v1( 1 );
|
||||
variant<int, float, double, char> const v2( 3.14f );
|
||||
variant<int, float, double, char> v3( 6.28 );
|
||||
variant<int, float, double, char> const v4( 'A' );
|
||||
|
||||
BOOST_TEST_EQ( (visit( []( auto x1, auto x2, auto x3, auto x4 ){ return (long long)(x1 * 100) * 100000000 + (long long)(x2 * 100) * 100000 + (long long)(x3 * 10000) + (int)x4; }, v1, v2, v3, v4 )), 10031462800 + 'A' );
|
||||
|
||||
visit( []( auto x1, auto x2, auto x3, auto x4 ){ BOOST_TEST_EQ( x1, 1 ); BOOST_TEST_EQ( x2, 3.14f ); BOOST_TEST_EQ( x3, 6.28 ); BOOST_TEST_EQ( x4, 'A' ); }, v1, v2, v3, v4 );
|
||||
visit( []( auto x1, auto x2, auto x3, auto x4 ){ BOOST_TEST_EQ( x1, 1 ); BOOST_TEST_EQ( x2, 3.14f ); BOOST_TEST_EQ( x3, 6.28 ); BOOST_TEST_EQ( x4, 'A' ); }, std::move(v1), std::move(v2), std::move(v3), std::move(v4) );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
Reference in New Issue
Block a user