65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								#include "variant.h"
							 | 
						||
| 
								 | 
							
								namespace meta
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									namespace detail
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										template<typename T>
							 | 
						||
| 
								 | 
							
										struct variant_helper;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										template<typename ... Ts>
							 | 
						||
| 
								 | 
							
										struct variant_helper<std::variant<Ts...>>
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											static constexpr auto ConstructJT()
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												using T = std::variant<Ts...>;
							 | 
						||
| 
								 | 
							
												return std::array<T(*)(), sizeof...(Ts)>
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													[]() -> T
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														return Ts{};
							 | 
						||
| 
								 | 
							
													} ...
							 | 
						||
| 
								 | 
							
												};
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									template<template<class T> typename Template, typename ...Ts>
							 | 
						||
| 
								 | 
							
									struct variant_wrap <std::variant<Ts...>, Template>
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										using type = std::variant<Template<Ts>...>;
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									template<typename ... Ts>
							 | 
						||
| 
								 | 
							
									struct tuple_to_variant <std::tuple<Ts...>>
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										using type = std::variant<Ts...>;
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									template<typename T>
							 | 
						||
| 
								 | 
							
									constexpr auto variant_construct(size_t i) noexcept
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										constexpr auto jt = detail::variant_helper<T>::ConstructJT();
							 | 
						||
| 
								 | 
							
										return jt[i]();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<typename FindMe>
							 | 
						||
| 
								 | 
							
								    struct index_in_variant<FindMe, std::variant<>>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        static constexpr uint8_t value = 0;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<typename FindMe, typename ... Ts>
							 | 
						||
| 
								 | 
							
								    struct index_in_variant<FindMe, std::variant<FindMe, Ts...>>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        static constexpr uint8_t value = 0;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<typename FindMe, typename First, typename ... Ts>
							 | 
						||
| 
								 | 
							
								    struct index_in_variant<FindMe, std::variant<First, Ts...>>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        static constexpr uint8_t value = index_in_variant<FindMe, std::variant<Ts...>>::value + 1;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}
							 |