#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 }