Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:36:38

0001 //===-- NonTrivialTypeVisitor.h - Visitor for non-trivial Types -*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 //  This file defines the visitor classes that are used to traverse non-trivial
0010 //  structs.
0011 //
0012 //===----------------------------------------------------------------------===//
0013 
0014 #ifndef LLVM_CLANG_AST_NONTRIVIALTYPEVISITOR_H
0015 #define LLVM_CLANG_AST_NONTRIVIALTYPEVISITOR_H
0016 
0017 #include "clang/AST/Type.h"
0018 
0019 namespace clang {
0020 
0021 template <class Derived, class RetTy = void> struct DestructedTypeVisitor {
0022   template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
0023     return asDerived().visitWithKind(FT.isDestructedType(), FT,
0024                                      std::forward<Ts>(Args)...);
0025   }
0026 
0027   template <class... Ts>
0028   RetTy visitWithKind(QualType::DestructionKind DK, QualType FT,
0029                       Ts &&... Args) {
0030     switch (DK) {
0031     case QualType::DK_objc_strong_lifetime:
0032       return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
0033     case QualType::DK_nontrivial_c_struct:
0034       return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
0035     case QualType::DK_none:
0036       return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
0037     case QualType::DK_cxx_destructor:
0038       return asDerived().visitCXXDestructor(FT, std::forward<Ts>(Args)...);
0039     case QualType::DK_objc_weak_lifetime:
0040       return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
0041     }
0042 
0043     llvm_unreachable("unknown destruction kind");
0044   }
0045 
0046   Derived &asDerived() { return static_cast<Derived &>(*this); }
0047 };
0048 
0049 template <class Derived, class RetTy = void>
0050 struct DefaultInitializedTypeVisitor {
0051   template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
0052     return asDerived().visitWithKind(
0053         FT.isNonTrivialToPrimitiveDefaultInitialize(), FT,
0054         std::forward<Ts>(Args)...);
0055   }
0056 
0057   template <class... Ts>
0058   RetTy visitWithKind(QualType::PrimitiveDefaultInitializeKind PDIK,
0059                       QualType FT, Ts &&... Args) {
0060     switch (PDIK) {
0061     case QualType::PDIK_ARCStrong:
0062       return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
0063     case QualType::PDIK_ARCWeak:
0064       return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
0065     case QualType::PDIK_Struct:
0066       return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
0067     case QualType::PDIK_Trivial:
0068       return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
0069     }
0070 
0071     llvm_unreachable("unknown default-initialize kind");
0072   }
0073 
0074   Derived &asDerived() { return static_cast<Derived &>(*this); }
0075 };
0076 
0077 template <class Derived, bool IsMove, class RetTy = void>
0078 struct CopiedTypeVisitor {
0079   template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
0080     QualType::PrimitiveCopyKind PCK =
0081         IsMove ? FT.isNonTrivialToPrimitiveDestructiveMove()
0082                : FT.isNonTrivialToPrimitiveCopy();
0083     return asDerived().visitWithKind(PCK, FT, std::forward<Ts>(Args)...);
0084   }
0085 
0086   template <class... Ts>
0087   RetTy visitWithKind(QualType::PrimitiveCopyKind PCK, QualType FT,
0088                       Ts &&... Args) {
0089     asDerived().preVisit(PCK, FT, std::forward<Ts>(Args)...);
0090 
0091     switch (PCK) {
0092     case QualType::PCK_ARCStrong:
0093       return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
0094     case QualType::PCK_ARCWeak:
0095       return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
0096     case QualType::PCK_Struct:
0097       return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
0098     case QualType::PCK_Trivial:
0099       return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
0100     case QualType::PCK_VolatileTrivial:
0101       return asDerived().visitVolatileTrivial(FT, std::forward<Ts>(Args)...);
0102     }
0103 
0104     llvm_unreachable("unknown primitive copy kind");
0105   }
0106 
0107   Derived &asDerived() { return static_cast<Derived &>(*this); }
0108 };
0109 
0110 } // end namespace clang
0111 
0112 #endif