blob: c338b669b7084f0e37c37724f305096fac1928f2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#pragma once
#include "cps/FunctionAST.h"
#include "cps/TypeAST.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
namespace cps {
struct TemplateParam {
std::string Name;
bool IsPack = false;
int Line = 0;
};
class TemplateDeclAST : public StmtAST {
std::vector<TemplateParam> Params;
std::unique_ptr<FunctionDefAST> Function;
std::unique_ptr<ClassTypeDeclAST> Class;
public:
TemplateDeclAST(std::vector<TemplateParam> Params, std::unique_ptr<FunctionDefAST> Function)
: Params(std::move(Params)), Function(std::move(Function)) {}
TemplateDeclAST(std::vector<TemplateParam> Params, std::unique_ptr<ClassTypeDeclAST> Class)
: Params(std::move(Params)), Class(std::move(Class)) {}
const auto &getParams() const { return Params; }
const std::string &getName() const {
return Function ? Function->getProto()->getName() : Class->getName();
}
bool isVariadic() const { return !Params.empty() && Params.back().IsPack; }
FunctionDefAST *getFunction() const { return Function.get(); }
ClassTypeDeclAST *getClass() const { return Class.get(); }
};
class PackExpansionExprAST : public ExprAST {
std::string Name;
public:
PackExpansionExprAST(std::string Name, int Line)
: ExprAST(Line), Name(std::move(Name)) {}
const std::string &getName() const { return Name; }
};
} // namespace cps
|