fork download
  1. #include <cstddef>
  2. #include <type_traits>
  3.  
  4. #define alignas(...) __attribute__((__aligned__(alignof(decltype(::wheels::detail::get_type_with_alignment<__VA_ARGS__>())))))
  5.  
  6. namespace wheels {
  7. namespace detail {
  8. constexpr std::size_t max(std::size_t n) { return n; }
  9. constexpr std::size_t max(std::size_t a, std::size_t b) { return a > b? a : b; }
  10. template <typename... T>
  11. constexpr std::size_t max(std::size_t h, T... t) { return max(h, max(t...)); }
  12.  
  13. template <std::size_t... N> struct __attribute__((__aligned__(max(N...)))) alignment_type {};
  14. template <typename... T> alignment_type<alignof(T)...> get_type_with_alignment();
  15. template <std::size_t... N> alignment_type<N...> get_type_with_alignment();
  16. }
  17.  
  18. template <std::size_t Len, typename... T>
  19. struct aligned_union {
  20. static constexpr std::size_t alignment_value = detail::max(alignof(T)...);
  21. struct type { alignas(T...) char unnamed[detail::max(Len, sizeof(T)...)]; };
  22. };
  23. template <typename... T>
  24. using AlignedUnion = typename aligned_union<1, T...>::type;
  25.  
  26. #define STATIC_ASSERT(...) static_assert((__VA_ARGS__), #__VA_ARGS__)
  27. STATIC_ASSERT(std::is_pod<AlignedUnion<char, int, double>>::value);
  28. STATIC_ASSERT(sizeof(AlignedUnion<char, int, double>) >= sizeof(char));
  29. STATIC_ASSERT(sizeof(AlignedUnion<char, int, double>) >= sizeof(int));
  30. STATIC_ASSERT(sizeof(AlignedUnion<char, int, double>) >= sizeof(double));
  31. STATIC_ASSERT(alignof(AlignedUnion<char, int, double>) >= alignof(char));
  32. STATIC_ASSERT(alignof(AlignedUnion<char, int, double>) >= alignof(int));
  33. STATIC_ASSERT(alignof(AlignedUnion<char, int, double>) >= alignof(double));
  34. }
  35.  
  36. int main() {}
  37.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty