zengine-old/engine/3rdparty/zlib/include/meta/variant.inl

65 lines
1.4 KiB
Plaintext
Raw Permalink Normal View History

2024-06-16 22:52:45 +08:00
#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;
};
}