clang  10.0.0svn
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 
16 #include "clang/AST/TemplateBase.h"
17 
18 namespace clang {
19 
20 namespace templateargumentvisitor {
21 
22 /// A simple visitor class that helps create template argument visitors.
23 template <template <typename> class Ref, typename ImplClass,
24  typename RetTy = void, typename... ParamTys>
25 class Base {
26 public:
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);
36  DISPATCH(Type);
37  DISPATCH(Declaration);
38  DISPATCH(NullPtr);
39  DISPATCH(Integral);
40  DISPATCH(Template);
41  DISPATCH(TemplateExpansion);
42  DISPATCH(Expression);
43  DISPATCH(Pack);
44  }
45  llvm_unreachable("TemplateArgument is not covered in switch!");
46  }
47 
48  // If the implementation chooses not to implement a certain visit
49  // method, fall back to the parent.
50 
51 #define VISIT_METHOD(CATEGORY) \
52  RetTy Visit##CATEGORY##TemplateArgument(REF(TemplateArgument) TA, \
53  ParamTys... P) { \
54  return VisitTemplateArgument(TA, std::forward<ParamTys>(P)...); \
55  }
56 
58  VISIT_METHOD(Type);
59  VISIT_METHOD(Declaration);
60  VISIT_METHOD(NullPtr);
61  VISIT_METHOD(Integral);
62  VISIT_METHOD(Template);
63  VISIT_METHOD(TemplateExpansion);
64  VISIT_METHOD(Expression);
65  VISIT_METHOD(Pack);
66 
68  return RetTy();
69  }
70 
71 #undef REF
72 #undef DISPATCH
73 #undef VISIT_METHOD
74 };
75 
76 } // namespace templateargumentvisitor
77 
78 /// A simple visitor class that helps create template argument visitors.
79 ///
80 /// This class does not preserve constness of TemplateArgument references (see
81 /// also ConstTemplateArgumentVisitor).
82 template <typename ImplClass, typename RetTy = void, typename... ParamTys>
84  : public templateargumentvisitor::Base<std::add_lvalue_reference, ImplClass,
85  RetTy, ParamTys...> {};
86 
87 /// A simple visitor class that helps create template argument visitors.
88 ///
89 /// This class preserves constness of TemplateArgument references (see also
90 /// TemplateArgumentVisitor).
91 template <typename ImplClass, typename RetTy = void, typename... ParamTys>
93  : public templateargumentvisitor::Base<llvm::make_const_ref, ImplClass,
94  RetTy, ParamTys...> {};
95 
96 } // namespace clang
97 
98 #endif // LLVM_CLANG_AST_TEMPLATEARGUMENTVISITOR_H
RetTy VisitTemplateArgument(REF(TemplateArgument), ParamTys...)
RetTy Visit(REF(TemplateArgument) TA, ParamTys... P)
StringRef P
The base class of the type hierarchy.
Definition: Type.h:1436
#define REF(CLASS)
A simple visitor class that helps create template argument visitors.
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:50
Dataflow Directional Tag Classes.
ArgKind getKind() const
Return the kind of stored template argument.
Definition: TemplateBase.h:234
bool Null(InterpState &S, CodePtr OpPC)
Definition: Interp.h:821
#define DISPATCH(NAME)