clang 20.0.0git
TemplateArgumentVisitor.h
Go to the documentation of this file.
1//===- TemplateArgumentVisitor.h - Visitor for TArg subclasses --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the TemplateArgumentVisitor interface.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_TEMPLATEARGUMENTVISITOR_H
14#define LLVM_CLANG_AST_TEMPLATEARGUMENTVISITOR_H
15
17
18namespace clang {
19
20namespace templateargumentvisitor {
21
22/// A simple visitor class that helps create template argument visitors.
23template <template <typename> class Ref, typename ImplClass,
24 typename RetTy = void, typename... ParamTys>
25class Base {
26public:
27#define REF(CLASS) typename Ref<CLASS>::type
28#define DISPATCH(NAME) \
29 case TemplateArgument::NAME: \
30 return static_cast<ImplClass *>(this)->Visit##NAME##TemplateArgument( \
31 TA, std::forward<ParamTys>(P)...)
32
33 RetTy Visit(REF(TemplateArgument) TA, ParamTys... P) {
34 switch (TA.getKind()) {
35 DISPATCH(Null);
38 DISPATCH(NullPtr);
39 DISPATCH(Integral);
40 DISPATCH(StructuralValue);
41 DISPATCH(Template);
42 DISPATCH(TemplateExpansion);
44 DISPATCH(Pack);
45 }
46 llvm_unreachable("TemplateArgument is not covered in switch!");
47 }
48
49 // If the implementation chooses not to implement a certain visit
50 // method, fall back to the parent.
51
52#define VISIT_METHOD(CATEGORY) \
53 RetTy Visit##CATEGORY##TemplateArgument(REF(TemplateArgument) TA, \
54 ParamTys... P) { \
55 return VisitTemplateArgument(TA, std::forward<ParamTys>(P)...); \
56 }
57
61 VISIT_METHOD(NullPtr);
62 VISIT_METHOD(Integral);
63 VISIT_METHOD(StructuralValue);
64 VISIT_METHOD(Template);
65 VISIT_METHOD(TemplateExpansion);
68
70 return RetTy();
71 }
72
73#undef REF
74#undef DISPATCH
75#undef VISIT_METHOD
76};
77
78} // namespace templateargumentvisitor
79
80/// A simple visitor class that helps create template argument visitors.
81///
82/// This class does not preserve constness of TemplateArgument references (see
83/// also ConstTemplateArgumentVisitor).
84template <typename ImplClass, typename RetTy = void, typename... ParamTys>
86 : public templateargumentvisitor::Base<std::add_lvalue_reference, ImplClass,
87 RetTy, ParamTys...> {};
88
89/// A simple visitor class that helps create template argument visitors.
90///
91/// This class preserves constness of TemplateArgument references (see also
92/// TemplateArgumentVisitor).
93template <typename ImplClass, typename RetTy = void, typename... ParamTys>
95 : public templateargumentvisitor::Base<llvm::make_const_ref, ImplClass,
96 RetTy, ParamTys...> {};
97
98} // namespace clang
99
100#endif // LLVM_CLANG_AST_TEMPLATEARGUMENTVISITOR_H
StringRef P
#define DISPATCH(NAME)
Definition: AttrVisitor.h:28
#define REF(CLASS)
A simple visitor class that helps create template argument visitors.
A simple visitor class that helps create template argument visitors.
Represents a template argument.
Definition: TemplateBase.h:61
ArgKind getKind() const
Return the kind of stored template argument.
Definition: TemplateBase.h:295
The base class of the type hierarchy.
Definition: Type.h:1829
A simple visitor class that helps create template argument visitors.
RetTy Visit(REF(TemplateArgument) TA, ParamTys... P)
RetTy VisitTemplateArgument(REF(TemplateArgument), ParamTys...)
The JSON file list parser is used to communicate input to InstallAPI.