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