#pragma once
|
|
|
|
#include "core.h"
|
|
|
|
namespace vlc
|
|
{
|
|
#ifndef VLC_HAS_STD_ALIGNED_UNION
|
|
namespace detail
|
|
{
|
|
template<size_t...> struct Max;
|
|
|
|
template<> struct Max<>
|
|
{
|
|
static constexpr size_t value = 0;
|
|
};
|
|
|
|
template<size_t val> struct Max<val>
|
|
{
|
|
static constexpr size_t value = val;
|
|
};
|
|
|
|
template<size_t A, size_t B, size_t... Rest> struct Max<A, B, Rest...> :
|
|
public Max<A < B ? B : A, Rest...>
|
|
{
|
|
};
|
|
}
|
|
|
|
template<size_t minSize, typename... Types> struct aligned_union
|
|
{
|
|
static constexpr size_t len = detail::Max<minSize, sizeof(Types)...>::value;
|
|
static constexpr size_t alignment = detail::Max<std::alignment_of<Types>::value...>::value;
|
|
|
|
using type = typename std::aligned_storage<len, alignment>::type;
|
|
};
|
|
#else
|
|
using std::aligned_union;
|
|
#endif
|
|
}
|