diff --git a/include/etl/private/variant_legacy.h b/include/etl/private/variant_legacy.h index 8d6ba1a3..f91b0c4b 100644 --- a/include/etl/private/variant_legacy.h +++ b/include/etl/private/variant_legacy.h @@ -98,10 +98,11 @@ namespace etl /// 'Bad variant access' exception for the variant class. ///\ingroup variant //*************************************************************************** - class bad_variant_access : public variant_exception { + class bad_variant_access : public variant_exception + { public: bad_variant_access(string_type file_name_, numeric_type line_number_) - : variant_exception(ETL_ERROR_TEXT("variant:bad variant access", ETL_VARIANT_FILE_ID"A"), file_name_, line_number_) + : variant_exception(ETL_ERROR_TEXT("variant:bad variant access", ETL_VARIANT_FILE_ID"B"), file_name_, line_number_) {} }; @@ -1073,18 +1074,18 @@ namespace etl { template struct variant_alternative_helper; -#define ETL_VARIANT_HELPER(INDEX, TYPE) \ - template \ - struct variant_alternative_helper> \ - { \ - typedef TYPE type; \ +#define ETL_VARIANT_HELPER(INDEX, TYPE) \ + template \ + struct variant_alternative_helper > \ + { \ + typedef TYPE type; \ }; ETL_VARIANT_HELPER(0, T1) ETL_VARIANT_HELPER(1, T2) @@ -1096,41 +1097,49 @@ namespace etl ETL_VARIANT_HELPER(7, T8) #undef ETL_VARIANT_HELPER } // namespace private_variant + template struct variant_alternative { typedef typename private_variant::variant_alternative_helper::type type; }; + template struct variant_alternative { typedef typename private_variant::variant_alternative_helper::type const type; }; + template struct variant_alternative { typedef typename private_variant::variant_alternative_helper::type volatile type; }; + template struct variant_alternative { typedef typename private_variant::variant_alternative_helper::type const volatile type; }; + template inline T& get(TVariant& variant) { return variant.template get(); } + template inline T const& get(TVariant const& variant) { return variant.template get(); } + template inline typename variant_alternative::type& get(TVariant& variant) { return get::type>(variant); } + template inline typename variant_alternative::type& get(TVariant const& variant) { @@ -1143,15 +1152,15 @@ namespace etl { \ switch (variant.index()) \ { \ - case 0: return static_cast(visitor(get<0>(variant))); \ - case 1: return static_cast(visitor(get<1>(variant))); \ - case 2: return static_cast(visitor(get<2>(variant))); \ - case 3: return static_cast(visitor(get<3>(variant))); \ - case 4: return static_cast(visitor(get<4>(variant))); \ - case 5: return static_cast(visitor(get<5>(variant))); \ - case 6: return static_cast(visitor(get<6>(variant))); \ - case 7: return static_cast(visitor(get<7>(variant))); \ - default: ETL_ASSERT(false, ETL_ERROR(bad_variant_access)); \ + case 0: return static_cast(visitor(get<0>(variant))); \ + case 1: return static_cast(visitor(get<1>(variant))); \ + case 2: return static_cast(visitor(get<2>(variant))); \ + case 3: return static_cast(visitor(get<3>(variant))); \ + case 4: return static_cast(visitor(get<4>(variant))); \ + case 5: return static_cast(visitor(get<5>(variant))); \ + case 6: return static_cast(visitor(get<6>(variant))); \ + case 7: return static_cast(visitor(get<7>(variant))); \ + default: ETL_ASSERT(false, ETL_ERROR(bad_variant_access)); \ } \ } diff --git a/include/etl/private/variant_variadic.h b/include/etl/private/variant_variadic.h index e85e8045..e4c92efb 100644 --- a/include/etl/private/variant_variadic.h +++ b/include/etl/private/variant_variadic.h @@ -430,10 +430,11 @@ namespace etl /// 'Bad variant access' exception for the variant class. ///\ingroup variant //*************************************************************************** - class bad_variant_access : public variant_exception { + class bad_variant_access : public variant_exception + { public: bad_variant_access(string_type file_name_, numeric_type line_number_) - : variant_exception(ETL_ERROR_TEXT("variant:bad variant access", ETL_VARIANT_FILE_ID"A"), file_name_, line_number_) + : variant_exception(ETL_ERROR_TEXT("variant:bad variant access", ETL_VARIANT_FILE_ID"B"), file_name_, line_number_) {} }; @@ -1289,8 +1290,9 @@ namespace etl template struct single_visit_result_type { - using type = decltype(std::declval()(std::declval()...)); + using type = decltype(etl::declval()(etl::declval()...)); }; + template using single_visit_result_type_t = typename single_visit_result_type::type; @@ -1311,6 +1313,7 @@ namespace etl //*************************************************************************** template