Instantiator
Generate c++ template instantiations
Loading...
Searching...
No Matches
TemplateArgument.cpp
Go to the documentation of this file.
2
3#include <clang/AST/TemplateBase.h>
4#include <cstddef>
5
6#include "spdlog/spdlog.h"
7
8#include "clang/AST/TemplateName.h"
9#include "llvm/ADT/SmallString.h"
10
11namespace Instantiator {
12
13std::string TemplateArgument::name(const std::string& sep) const
14{
15 std::string out = {};
16 for(std::size_t i = 0; i < names.size(); ++i) {
17 if(i < names.size() - 1) {
18 out += names[i] + sep;
19 } else {
20 out += names[i];
21 }
22 }
23 return out;
24}
25
26TemplateArgument TemplateArgument::createFromTemplateArgument(const clang::TemplateArgument* parm, const clang::PrintingPolicy pp)
27{
29
30 out.is_dependent = parm->isDependent();
31
32 switch(parm->getKind()) {
33 case clang::TemplateArgument::ArgKind::Type: {
34 out.names[0] = parm->getAsType().getAsString(pp);
36 spdlog::debug("type: {}", out.names[0]);
37 break;
38 }
39 case clang::TemplateArgument::ArgKind::Integral: {
40 llvm::SmallString<10> tmp_name;
41 parm->getAsIntegral().toString(tmp_name);
42 out.names[0] = tmp_name.str().str();
44 spdlog::debug("integral: {}", out.names[0]);
45 break;
46 }
47 case clang::TemplateArgument::ArgKind::Pack: {
48 out.names.resize(parm->pack_size());
49 for(auto pack_it = parm->pack_begin(); pack_it != parm->pack_end(); pack_it++) {
50 switch(pack_it->getKind()) {
51 case clang::TemplateArgument::ArgKind::Type: {
52 out.names[std::distance(parm->pack_begin(), pack_it)] = pack_it->getAsType().getAsString(pp);
53 break;
54 }
55 case clang::TemplateArgument::ArgKind::Integral: {
56 llvm::SmallString<10> name;
57 pack_it->getAsIntegral().toString(name);
58 out.names[std::distance(parm->pack_begin(), pack_it)] = name.str().str();
59 break;
60 }
61 default: {
62 break;
63 }
64 }
65 }
67 break;
68 }
69 case clang::TemplateArgument::ArgKind::Template: {
70 llvm::raw_string_ostream OS(out.names[0]);
71#if INSTANTIATOR_LLVM_MAJOR > 13
72 parm->getAsTemplate().print(OS, pp, clang::TemplateName::Qualified::Fully);
73#else
74 parm->getAsTemplate().print(OS, pp, false);
75#endif
76 OS.str();
78 break;
79 }
80 default: {
81 break;
82 }
83 }
84 return out;
85}
86
88{
89 spdlog::debug("name dependent={}, other.name dependent={}", is_dependent, other.is_dependent);
90 if(is_dependent or other.is_dependent) { return true /*kind == other.kind*/; }
91 spdlog::debug("Compare of {} and {}", name(), other.name());
92 return name() == other.name();
93}
94
95} // namespace Instantiator
Struct for the collection of all relevant data for a function parameter.
std::vector< std::string > names
static TemplateArgument createFromTemplateArgument(const clang::TemplateArgument *parm, clang::PrintingPolicy pp)
std::string name(const std::string &sep=" ") const
bool compare(const TemplateArgument &other) const