xref: /llvm-project/clang/test/Modules/Inputs/lsv-debuginfo/A/ADT.h (revision ba6fdc57b4be3d65903531a7ad734ccf417cb0a6)
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