[PATCH] D19850: Make llvm::AlignedCharArrayUnion a variadic template.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 20:14:41 PDT 2016


dblaikie added a subscriber: dblaikie.
dblaikie added a comment.

Looks good to me. Optional generalization of the metaprogramming if you like.

(actually, could even be generalized further by taking the test functor (max, min, etc) as another template parameter, I suppose)


================
Comment at: include/llvm/Support/AlignOf.h:219-241
@@ -218,21 +218,25 @@
 namespace detail {
-template <typename T1,
-          typename T2 = char, typename T3 = char, typename T4 = char,
-          typename T5 = char, typename T6 = char, typename T7 = char,
-          typename T8 = char, typename T9 = char, typename T10 = char>
-class AlignerImpl {
-  T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7; T8 t8; T9 t9; T10 t10;
-
-  AlignerImpl() = delete;
+template <typename T, typename... Ts> struct AlignerImpl {
+  enum {
+    X = AlignOf<T>::Alignment,
+    Y = AlignerImpl<Ts...>::Alignment,
+    Alignment = (X > Y) ? X : Y
+  };
 };
 
-template <typename T1,
-          typename T2 = char, typename T3 = char, typename T4 = char,
-          typename T5 = char, typename T6 = char, typename T7 = char,
-          typename T8 = char, typename T9 = char, typename T10 = char>
-union SizerImpl {
-  char arr1[sizeof(T1)], arr2[sizeof(T2)], arr3[sizeof(T3)], arr4[sizeof(T4)],
-       arr5[sizeof(T5)], arr6[sizeof(T6)], arr7[sizeof(T7)], arr8[sizeof(T8)],
-       arr9[sizeof(T9)], arr10[sizeof(T10)];
+template <typename T> struct AlignerImpl<T> {
+  enum { Alignment = AlignOf<T>::Alignment };
+};
+
+template <typename T, typename... Ts> struct SizerImpl {
+  enum {
+    X = sizeof(T),
+    Y = SizerImpl<Ts...>::SizeOf,
+    SizeOf = (X > Y) ? X : Y
+  };
+};
+
+template <typename T> struct SizerImpl<T> {
+  enum { SizeOf = sizeof(T) };
 };
 } // end namespace detail
----------------
Could potentially generalize the two variadic impls to take the non-variadic as a trait, if you like?

  template<template Trait<typename>, typename T, typename... Ts> struct Max {
    enum {
      X = Trait<T>::value,
      Y = Max<Trait, Ts...>::value,
      value = (X > Y) ? X : Y
    };
  };
  template<template Trait<typename>, typename T> struct Max<Trait, T> {
    enum { value = Trait<T>::value; };
  };

  template<typename T> struct SizeOf {
    enum { value = sizeof(T) };
  };
  template<typename T> struct AlignOf {
    enum { value = alignof(T) };
  };
  ...
  Max<SizeOf, Ts...>::value
  Max<AlignOf, Ts...>::value


http://reviews.llvm.org/D19850





More information about the llvm-commits mailing list