diff --git a/include/etl/private/variant_legacy.h b/include/etl/private/variant_legacy.h index dc2dbd70..3c0e788e 100644 --- a/include/etl/private/variant_legacy.h +++ b/include/etl/private/variant_legacy.h @@ -480,6 +480,19 @@ namespace etl type_id = Type_Id_Lookup::type_id; } + //*************************************************************************** + /// Constructor that catches any types that are not supported. + /// Forces a ETL_STATIC_ASSERT. + //*************************************************************************** + template + explicit variant(etl::in_place_index_t, T const& value) + : type_id(Index) + { + ETL_STATIC_ASSERT(Type_Id_Lookup::type_id == Index, "Missmatched type"); + ::new (static_cast(data)) T(value); + type_id = Index; + } + //*************************************************************************** /// Copy constructor. ///\param other The other variant object to copy. diff --git a/test/test_variant_legacy.cpp b/test/test_variant_legacy.cpp index 4e53473b..73c26ef7 100644 --- a/test/test_variant_legacy.cpp +++ b/test/test_variant_legacy.cpp @@ -204,7 +204,7 @@ namespace typedef etl::legacy::variant test_variant_emplace; - SUITE(test_variant) + SUITE(test_variant_legacy) { TEST(test_alignment) { @@ -258,6 +258,34 @@ namespace CHECK_EQUAL(text, variant_text.get()); } + //************************************************************************* + TEST(test_constructor_in_place_value) + { + // Char. + char c = 'a'; + test_variant_3a variant_char(etl::in_place_index_t<0>(), c); + + CHECK(variant_char.is_type()); + CHECK(variant_char.is_valid()); + CHECK_EQUAL(c, variant_char.get()); + + // Int. + int i = 1; + test_variant_3a variant_int(etl::in_place_index_t<1>(), i); + + CHECK(variant_int.is_type()); + CHECK(variant_int.is_valid()); + CHECK_EQUAL(i, variant_int.get()); + + // String. + std::string text("Some Text"); + test_variant_3a variant_text(etl::in_place_index_t<2>(), text); + + CHECK(variant_text.is_type()); + CHECK(variant_text.is_valid()); + CHECK_EQUAL(text, variant_text.get()); + } + //************************************************************************* TEST(test_copy_constructor) {