blob: aa7395f55e24d3a9297e1d29b8db012d4878e837 [file]
// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0
#include "main.h"
#include <variant>
EIGEN_DECLARE_TEST(constructor_variant) {
PermutationMatrix<3> permutation;
permutation.setIdentity();
std::variant<Matrix3d, Array<double, 3, 3>> permutation_variant(permutation);
VERIFY_IS_EQUAL(permutation_variant.index(), std::size_t(0));
VERIFY_IS_EQUAL(std::get<Matrix3d>(permutation_variant), Matrix3d::Identity());
std::variant<Array<double, 3, 3>, Matrix3d> permutation_reversed(permutation);
VERIFY_IS_EQUAL(permutation_reversed.index(), std::size_t(1));
permutation.indices() << 2, 0, 1;
permutation_variant = permutation;
VERIFY_IS_EQUAL(std::get<Matrix3d>(permutation_variant), Matrix3d(permutation));
const Array3d array_source(1, 2, 3);
const Array3i array_integers(1, 2, 3);
static_assert(!std::is_convertible<Array3d, Array3i>::value, "Mixed scalars require an explicit cast");
static_assert(!std::is_convertible<Array3cd, Array3d>::value, "Complex-to-real requires an explicit cast");
std::variant<Array3d, Array3i> array_variant(array_source);
VERIFY_IS_EQUAL(array_variant.index(), std::size_t(0));
VERIFY((std::get<Array3d>(array_variant) == array_source).all());
array_variant = array_integers;
VERIFY((std::get<Array3i>(array_variant) == array_integers).all());
std::variant<Array3i, Array3d> array_reversed(array_source);
VERIFY((std::get<Array3d>(array_reversed) == array_source).all());
std::variant<ArrayXd, ArrayXi> array_dynamic(array_source + array_source);
VERIFY((std::get<ArrayXd>(array_dynamic) == 2 * array_source).all());
const Array3cd array_complex = array_source.cast<std::complex<double>>() * std::complex<double>(1, 2);
std::variant<Array3d, Array3cd> array_complex_variant(array_complex);
VERIFY((std::get<Array3cd>(array_complex_variant) == array_complex).all());
array_complex_variant = array_source;
VERIFY((std::get<Array3d>(array_complex_variant) == array_source).all());
std::variant<Array3cd, Array3d> array_complex_reversed(array_complex);
VERIFY((std::get<Array3cd>(array_complex_reversed) == array_complex).all());
std::variant<ArrayXd, ArrayXcd> array_complex_expression(array_complex + array_complex);
VERIFY((std::get<ArrayXcd>(array_complex_expression) == 2 * array_complex).all());
array_complex_expression = array_complex + array_complex;
VERIFY((std::get<ArrayXcd>(array_complex_expression) == 2 * array_complex).all());
const Vector3d source(1, 2, 3);
const Vector3i integers(1, 2, 3);
std::variant<Vector3d, Vector3i> variant(source);
VERIFY_IS_EQUAL(variant.index(), std::size_t(0));
VERIFY_IS_EQUAL(std::get<Vector3d>(variant), source);
variant = integers;
VERIFY_IS_EQUAL(std::get<Vector3i>(variant), integers);
std::variant<Vector3i, Vector3d> reversed(source);
VERIFY_IS_EQUAL(std::get<Vector3d>(reversed), source);
std::variant<VectorXd, VectorXi> dynamic(source + source);
VERIFY_IS_EQUAL(std::get<VectorXd>(dynamic), 2 * source);
const Vector3cd complex = source.cast<std::complex<double>>() * std::complex<double>(1, 2);
std::variant<Vector3d, Vector3cd> complex_variant(complex);
VERIFY_IS_EQUAL(std::get<Vector3cd>(complex_variant), complex);
complex_variant = source;
VERIFY_IS_EQUAL(std::get<Vector3d>(complex_variant), source);
complex_variant = complex;
VERIFY_IS_EQUAL(std::get<Vector3cd>(complex_variant), complex);
std::variant<Vector3cd, Vector3d> complex_reversed(complex);
VERIFY_IS_EQUAL(std::get<Vector3cd>(complex_reversed), complex);
std::variant<VectorXd, VectorXcd> complex_expression(complex + complex);
VERIFY_IS_EQUAL(std::get<VectorXcd>(complex_expression), 2 * complex);
complex_expression = complex + complex;
VERIFY_IS_EQUAL(std::get<VectorXcd>(complex_expression), 2 * complex);
}