31#include "../platform.h"
32#include "../utility.h"
34#include "../largest.h"
35#include "../exception.h"
36#include "../type_traits.h"
37#include "../integral_limits.h"
38#include "../static_assert.h"
39#include "../alignment.h"
40#include "../error_handler.h"
41#include "../null_type.h"
42#include "../placement_new.h"
46#if defined(ETL_COMPILER_KEIL)
47 #pragma diag_suppress 940
48 #pragma diag_suppress 111
58#if ETL_NOT_USING_LEGACY_VARIANT
62 namespace private_variant
138 template <
typename T1,
163 template <
typename U1,
typename U2,
typename U3,
typename U4,
typename U5,
typename U6,
typename U7,
typename U8>
169 typedef typename etl::largest_type<T1, T2, T3, T4, T5, T6, T7, T8>::type largest_t;
174 static const size_t SIZE =
sizeof(largest_t);
195 template <
typename T>
196 struct Type_Id_Lookup
212 template <
typename T>
214 etl::is_same<T, T1>::value ||
215 etl::is_same<T, T2>::value ||
216 etl::is_same<T, T3>::value ||
217 etl::is_same<T, T4>::value ||
218 etl::is_same<T, T5>::value ||
219 etl::is_same<T, T6>::value ||
220 etl::is_same<T, T7>::value ||
221 etl::is_same<T, T8>::value>
244 template <
typename R1,
typename R2 = no_type2,
typename R3 = no_type3,
typename R4 = no_type4,
typename R5 = no_type5,
typename R6 = no_type6,
typename R7 = no_type7,
typename R8 = no_type8>
268 template <
typename R1,
typename R2,
typename R3,
typename R4,
typename R5,
typename R6,
typename R7>
295 template <
typename R1,
typename R2,
typename R3,
typename R4,
typename R5,
typename R6>
322 template <
typename R1,
typename R2,
typename R3,
typename R4,
typename R5>
349 template <
typename R1,
typename R2,
typename R3,
typename R4>
376 template <
typename R1,
typename R2,
typename R3>
403 template <
typename R1,
typename R2>
430 template <
typename R1>
465 : type_id(UNSUPPORTED_TYPE_ID)
474 template <
typename T>
477 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
479 ::new (
static_cast<T*
>(data))
T(value);
480 type_id = Type_Id_Lookup<T>::type_id;
490 switch (
other.type_id)
492 case 0: ::new (
static_cast<T1*
>(data))
T1(
other.get<
T1>());
break;
493 case 1: ::new (
static_cast<T2*
>(data))
T2(
other.get<
T2>());
break;
494 case 2: ::new (
static_cast<T3*
>(data))
T3(
other.get<
T3>());
break;
495 case 3: ::new (
static_cast<T4*
>(data))
T4(
other.get<
T4>());
break;
496 case 4: ::new (
static_cast<T5*
>(data))
T5(
other.get<
T5>());
break;
497 case 5: ::new (
static_cast<T6*
>(data))
T6(
other.get<
T6>());
break;
498 case 6: ::new (
static_cast<T7*
>(data))
T7(
other.get<
T7>());
break;
499 case 7: ::new (
static_cast<T8*
>(data))
T8(
other.get<
T8>());
break;
503 type_id =
other.type_id;
507#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VARIANT_FORCE_CPP03_IMPLEMENTATION)
511 template <
typename T,
typename...
Args>
514 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
518 type_id = Type_Id_Lookup<T>::type_id;
520 return *
static_cast<T*
>(data);
526 template <
typename T>
529 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
532 ::new (
static_cast<T*
>(data))
T();
533 type_id = Type_Id_Lookup<T>::type_id;
535 return *
static_cast<T*
>(data);
541 template <
typename T,
typename TP1>
544 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
547 ::new (
static_cast<T*
>(data))
T(value1);
548 type_id = Type_Id_Lookup<T>::type_id;
550 return *
static_cast<T*
>(data);
556 template <
typename T,
typename TP1,
typename TP2>
559 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
562 ::new (
static_cast<T*
>(data))
T(value1, value2);
563 type_id = Type_Id_Lookup<T>::type_id;
565 return *
static_cast<T*
>(data);
571 template <
typename T,
typename TP1,
typename TP2,
typename TP3>
574 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
577 ::new (
static_cast<T*
>(data))
T(value1, value2, value3);
578 type_id = Type_Id_Lookup<T>::type_id;
580 return *
static_cast<T*
>(data);
586 template <
typename T,
typename TP1,
typename TP2,
typename TP3,
typename TP4>
589 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
592 ::new (
static_cast<T*
>(data))
T(value1, value2, value3, value4);
593 type_id = Type_Id_Lookup<T>::type_id;
595 return *
static_cast<T*
>(data);
603 template <
typename T>
606 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
609 ::new (
static_cast<T*
>(data))
T(value);
610 type_id = Type_Id_Lookup<T>::type_id;
625 switch (
other.type_id)
627 case 0: ::new (
static_cast<T1*
>(data))
T1(
other.get<
T1>());
break;
628 case 1: ::new (
static_cast<T2*
>(data))
T2(
other.get<
T2>());
break;
629 case 2: ::new (
static_cast<T3*
>(data))
T3(
other.get<
T3>());
break;
630 case 3: ::new (
static_cast<T4*
>(data))
T4(
other.get<
T4>());
break;
631 case 4: ::new (
static_cast<T5*
>(data))
T5(
other.get<
T5>());
break;
632 case 5: ::new (
static_cast<T6*
>(data))
T6(
other.get<
T6>());
break;
633 case 6: ::new (
static_cast<T7*
>(data))
T7(
other.get<
T7>());
break;
634 case 7: ::new (
static_cast<T8*
>(data))
T8(
other.get<
T8>());
break;
638 type_id =
other.type_id;
651 return type_id ==
other.type_id;
659 template <
typename U1,
typename U2,
typename U3,
typename U4,
typename U5,
typename U6,
typename U7,
typename U8>
664 switch (
other.type_id)
666 case 0:
is_same = (type_id == Type_Id_Lookup<U1>::type_id);
break;
667 case 1:
is_same = (type_id == Type_Id_Lookup<U2>::type_id);
break;
668 case 2:
is_same = (type_id == Type_Id_Lookup<U3>::type_id);
break;
669 case 3:
is_same = (type_id == Type_Id_Lookup<U4>::type_id);
break;
670 case 4:
is_same = (type_id == Type_Id_Lookup<U5>::type_id);
break;
671 case 5:
is_same = (type_id == Type_Id_Lookup<U6>::type_id);
break;
672 case 6:
is_same = (type_id == Type_Id_Lookup<U7>::type_id);
break;
673 case 7:
is_same = (type_id == Type_Id_Lookup<U8>::type_id);
break;
688 case 0:
r.read(
static_cast<T1&
>(data));
break;
689 case 1:
r.read(
static_cast<T2&
>(data));
break;
690 case 2:
r.read(
static_cast<T3&
>(data));
break;
691 case 3:
r.read(
static_cast<T4&
>(data));
break;
692 case 4:
r.read(
static_cast<T5&
>(data));
break;
693 case 5:
r.read(
static_cast<T6&
>(data));
break;
694 case 6:
r.read(
static_cast<T7&
>(data));
break;
695 case 7:
r.read(
static_cast<T8&
>(data));
break;
706 return type_id != UNSUPPORTED_TYPE_ID;
713 template <
typename T>
716 return type_id == Type_Id_Lookup<T>::type_id;
740 template <
typename T>
743 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
746 return static_cast<T&
>(data);
754 template <
typename T>
757 ETL_STATIC_ASSERT(Type_Is_Supported<T>::value,
"Unsupported type");
760 return static_cast<const T&
>(data);
767 template <
typename TBase>
784 template <
typename TBase>
798 template <
typename TBase>
815 template <
typename TBase>
828 template <
typename TBase>
843 default:
is_base =
false;
break;
854 operator T3& () {
return get<T3>(); }
855 operator T4& () {
return get<T4>(); }
856 operator T5& () {
return get<T5>(); }
857 operator T6& () {
return get<T6>(); }
858 operator T7& () {
return get<T7>(); }
859 operator T8& () {
return get<T8>(); }
865 template <
typename T>
868 return Type_Is_Supported<T>::value;
876 void destruct_current()
880 case 0: {
static_cast<T1*
>(data)->~
T1();
break; }
881 case 1: {
static_cast<T2*
>(data)->~T2();
break; }
882 case 2: {
static_cast<T3*
>(data)->~T3();
break; }
883 case 3: {
static_cast<T4*
>(data)->~T4();
break; }
884 case 4: {
static_cast<T5*
>(data)->~T5();
break; }
885 case 5: {
static_cast<T6*
>(data)->~T6();
break; }
886 case 6: {
static_cast<T7*
>(data)->~T7();
break; }
887 case 7: {
static_cast<T8*
>(data)->~T8();
break; }
891 type_id = UNSUPPORTED_TYPE_ID;
907 namespace private_variant
909 template <
size_t,
typename>
910 struct variant_alternative_helper;
911#define ETL_VARIANT_HELPER(INDEX, TYPE) \
912 template <typename T1, \
920 struct variant_alternative_helper<INDEX, variant<T1, T2, T3, T4, T5, T6, T7, T8> > \
924 ETL_VARIANT_HELPER(0, T1)
925 ETL_VARIANT_HELPER(1, T2)
926 ETL_VARIANT_HELPER(2, T3)
927 ETL_VARIANT_HELPER(3, T4)
928 ETL_VARIANT_HELPER(4, T5)
929 ETL_VARIANT_HELPER(5, T6)
930 ETL_VARIANT_HELPER(6, T7)
931 ETL_VARIANT_HELPER(7, T8)
932#undef ETL_VARIANT_HELPER
935 template <
size_t tIndex,
typename TVariant>
938 typedef typename private_variant::variant_alternative_helper<tIndex, TVariant>::type type;
941 template <
size_t tIndex,
typename TVariant>
944 typedef typename private_variant::variant_alternative_helper<tIndex, TVariant>::type
const type;
947 template <
size_t tIndex,
typename TVariant>
950 typedef typename private_variant::variant_alternative_helper<tIndex, TVariant>::type
volatile type;
953 template <
size_t tIndex,
typename TVariant>
956 typedef typename private_variant::variant_alternative_helper<tIndex, TVariant>::type
const volatile type;
959 template <
typename T,
typename TVariant>
965 template <
typename T,
typename TVariant>
968 return variant.template
get<T>();
971 template <
size_t tIndex,
typename TVariant>
972 inline typename variant_alternative<tIndex, TVariant>::type&
get(
TVariant& variant)
977 template <
size_t tIndex,
typename TVariant>
978 inline typename variant_alternative<tIndex, TVariant const>::type&
get(
TVariant const& variant)
983#define ETL_GEN_LEGACY_VISIT(VISITQUAL, VARIANTQUAL) \
984 template <typename TReturn, typename TVisitor, typename TVariant> \
985 static TReturn visit(TVisitor VISITQUAL visitor, TVariant VARIANTQUAL variant) \
987 switch (variant.index()) \
989 case 0: return static_cast<TReturn>(visitor(get<0>(variant))); \
990 case 1: return static_cast<TReturn>(visitor(get<1>(variant))); \
991 case 2: return static_cast<TReturn>(visitor(get<2>(variant))); \
992 case 3: return static_cast<TReturn>(visitor(get<3>(variant))); \
993 case 4: return static_cast<TReturn>(visitor(get<4>(variant))); \
994 case 5: return static_cast<TReturn>(visitor(get<5>(variant))); \
995 case 6: return static_cast<TReturn>(visitor(get<6>(variant))); \
996 case 7: return static_cast<TReturn>(visitor(get<7>(variant))); \
997 default: ETL_ASSERT_FAIL_AND_RETURN_VALUE(ETL_ERROR(bad_variant_access), TReturn()); \
1001 ETL_GEN_LEGACY_VISIT(&, &)
1002 ETL_GEN_LEGACY_VISIT(
const&, &)
1003 ETL_GEN_LEGACY_VISIT(&,
const&)
1006#undef ETL_GEN_LEGACY_VISIT
1008#if ETL_NOT_USING_LEGACY_VARIANT
Definition variant_legacy.h:246
#define ETL_ASSERT(b, e)
Definition error_handler.h:316
Definition exception.h:47
Definition integral_limits.h:516
integral_constant
Definition type_traits_generator.h:832
is_base_of
Definition type_traits_generator.h:1252
is_same
Definition type_traits_generator.h:1041
variant(const T &value)
Definition variant_legacy.h:475
bool is_same_type(const variant< U1, U2, U3, U4, U5, U6, U7, U8 > &other) const
Definition variant_legacy.h:660
static bool is_supported_type()
Definition variant_legacy.h:866
const T & get() const
Definition variant_legacy.h:755
~variant()
Destructor.
Definition variant_legacy.h:230
T & emplace(const TP1 &value1, const TP2 &value2, const TP3 &value3, const TP4 &value4)
Emplace with four constructor parameters.
Definition variant_legacy.h:587
variant()
Definition variant_legacy.h:464
bool is_same_type(const variant &other) const
Definition variant_legacy.h:649
T & emplace(const TP1 &value1, const TP2 &value2, const TP3 &value3)
Emplace with three constructor parameters.
Definition variant_legacy.h:572
void call(reader &r)
Definition variant_legacy.h:684
T & get()
Definition variant_legacy.h:741
bool is_base_of() const
Check that TBase is a base class of the current variant value.
Definition variant_legacy.h:829
uint_least8_t type_id_t
The type used for ids.
Definition variant_legacy.h:153
T & emplace(const TP1 &value1)
Emplace with one constructor parameter.
Definition variant_legacy.h:542
const TBase * upcast_ptr() const
Definition variant_legacy.h:799
reader_type< T1, T2, T3, T4, T5, T6, T7, T8 > reader
The base type for derived readers.
Definition variant_legacy.h:457
bool is_type() const
Definition variant_legacy.h:714
void clear()
Clears the value to 'no valid stored value'.
Definition variant_legacy.h:730
T & emplace(const TP1 &value1, const TP2 &value2)
Emplace with two constructor parameters.
Definition variant_legacy.h:557
TBase * upcast_ptr()
Definition variant_legacy.h:768
T & emplace()
Emplace with one constructor parameter.
Definition variant_legacy.h:527
size_t index() const
Gets the index of the type currently stored or UNSUPPORTED_TYPE_ID.
Definition variant_legacy.h:722
TBase & upcast()
Definition variant_legacy.h:785
variant(const variant &other)
Definition variant_legacy.h:488
const TBase & upcast() const
Definition variant_legacy.h:816
bool is_valid() const
Definition variant_legacy.h:704
Definition variant_legacy.h:113
Definition variant_legacy.h:147
Definition variant_legacy.h:87
Definition variant_legacy.h:100
Definition variant_legacy.h:125
Definition variant_legacy.h:79
bitset_ext
Definition absolute.h:38
T & get(array< T, MAXN > &a)
Definition array.h:719
etl::optional< T > read(etl::bit_stream_reader &stream)
Read a checked type from a stream.
Definition bit_stream.h:1377
Definition alignment.h:233
pair holds two objects of arbitrary type
Definition utility.h:164
ETL_CONSTEXPR pair()
Default constructor.
Definition utility.h:176
Definition variant_legacy.h:70
Definition variant_legacy.h:937