@@ -406,30 +406,50 @@ struct Variant
406
406
}
407
407
408
408
template <typename ... NewTs>
409
- Variant<NewTs...> downcast () &&
409
+ decltype (auto ) downcast() &&
410
+ {
411
+ if constexpr (sizeof ...(NewTs) == 1 && (IsSpecializationOf<NewTs, Variant> && ...)) {
412
+ return move (*this ).template downcast_variant <NewTs...>();
413
+ } else {
414
+ Variant<NewTs...> instance { Variant<NewTs...>::invalid_index, Detail::VariantConstructTag {} };
415
+ visit ([&](auto & value) {
416
+ if constexpr (Variant<NewTs...>::template can_contain<RemoveCVReference<decltype (value)>>())
417
+ instance.set (move (value), Detail::VariantNoClearTag {});
418
+ });
419
+ VERIFY (instance.m_index != instance.invalid_index );
420
+ return instance;
421
+ }
422
+ }
423
+
424
+ template <typename ... NewTs>
425
+ decltype (auto ) downcast() const &
426
+ {
427
+ if constexpr (sizeof ...(NewTs) == 1 && (IsSpecializationOf<NewTs, Variant> && ...)) {
428
+ return (*this ).template downcast_variant (TypeWrapper<NewTs...> {});
429
+ } else {
430
+ Variant<NewTs...> instance { Variant<NewTs...>::invalid_index, Detail::VariantConstructTag {} };
431
+ visit ([&](auto const & value) {
432
+ if constexpr (Variant<NewTs...>::template can_contain<RemoveCVReference<decltype (value)>>())
433
+ instance.set (value, Detail::VariantNoClearTag {});
434
+ });
435
+ VERIFY (instance.m_index != instance.invalid_index );
436
+ return instance;
437
+ }
438
+ }
439
+
440
+ private:
441
+ template <typename ... NewTs>
442
+ Variant<NewTs...> downcast_variant (TypeWrapper<Variant<NewTs...>>) &&
410
443
{
411
- Variant<NewTs...> instance { Variant<NewTs...>::invalid_index, Detail::VariantConstructTag {} };
412
- visit ([&](auto & value) {
413
- if constexpr (Variant<NewTs...>::template can_contain<RemoveCVReference<decltype (value)>>())
414
- instance.set (move (value), Detail::VariantNoClearTag {});
415
- });
416
- VERIFY (instance.m_index != instance.invalid_index );
417
- return instance;
444
+ return move (*this ).template downcast <NewTs...>();
418
445
}
419
446
420
447
template <typename ... NewTs>
421
- Variant<NewTs...> downcast ( ) const &
448
+ Variant<NewTs...> downcast_variant (TypeWrapper<Variant<NewTs...>> ) const &
422
449
{
423
- Variant<NewTs...> instance { Variant<NewTs...>::invalid_index, Detail::VariantConstructTag {} };
424
- visit ([&](auto const & value) {
425
- if constexpr (Variant<NewTs...>::template can_contain<RemoveCVReference<decltype (value)>>())
426
- instance.set (value, Detail::VariantNoClearTag {});
427
- });
428
- VERIFY (instance.m_index != instance.invalid_index );
429
- return instance;
450
+ return (*this ).template downcast <NewTs...>();
430
451
}
431
452
432
- private:
433
453
static constexpr auto data_size = Detail::integer_sequence_generate_array<size_t >(0 , IntegerSequence<size_t , sizeof (Ts)...>()).max();
434
454
static constexpr auto data_alignment = Detail::integer_sequence_generate_array<size_t >(0 , IntegerSequence<size_t , alignof (Ts)...>()).max();
435
455
using Helper = Detail::Variant<IndexType, 0 , Ts...>;
0 commit comments