1 #ifndef ADT 2 #define ADT 3 4 #ifdef WITH_NAMESPACE 5 namespace llvm { 6 #endif 7 template <unsigned Alignment, unsigned Size> 8 struct AlignedCharArray { 9 alignas(Alignment) char buffer[Size]; 10 }; 11 12 template <typename T1> 13 class AlignerImpl { 14 T1 t1; 15 }; 16 17 template <typename T1> 18 union SizerImpl { 19 char arr1[sizeof(T1)]; 20 }; 21 22 template <typename T1> 23 struct AlignedCharArrayUnion 24 : AlignedCharArray<alignof(AlignerImpl<T1>), sizeof(SizerImpl<T1>)> {}; 25 26 template <typename T, unsigned N> 27 struct SmallVectorStorage { 28 AlignedCharArrayUnion<T> InlineElts[N]; 29 }; 30 template <typename T, unsigned N> 31 class SmallVector : SmallVectorStorage<T, N> {}; 32 33 template <typename T> 34 struct OptionalStorage { 35 AlignedCharArrayUnion<T> storage; 36 }; 37 template <typename T> 38 class Optional { 39 OptionalStorage<T> Storage; 40 }; 41 42 #ifdef WITH_NAMESPACE 43 } // namespace llvm 44 #endif 45 #endif 46