cpp.h
7.19 KB
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include "generator.h"
using namespace std;
using namespace clang;
/* Generator for C++ bindings.
*
* "checked" is set if C++ bindings should be generated
* that rely on the user to check for error conditions.
*/
class cpp_generator : public generator {
protected:
bool checked;
public:
cpp_generator(SourceManager &SM, set<RecordDecl *> &exported_types,
set<FunctionDecl *> exported_functions,
set<FunctionDecl *> functions,
bool checked = false) :
generator(SM, exported_types, exported_functions, functions),
checked(checked) {}
enum function_kind {
function_kind_static_method,
function_kind_member_method,
function_kind_constructor,
};
enum method_part {
decl,
impl,
};
virtual void generate();
private:
void print_forward_declarations(ostream &os);
void print_declarations(ostream &os);
void print_class(ostream &os, const isl_class &clazz);
void print_subclass_type(ostream &os, const isl_class &clazz);
void print_class_forward_decl(ostream &os, const isl_class &clazz);
void print_class_factory_decl(ostream &os, const isl_class &clazz,
const std::string &prefix = std::string());
void print_protected_constructors_decl(ostream &os,
const isl_class &clazz);
void print_copy_assignment_decl(ostream &os, const isl_class &clazz);
void print_public_constructors_decl(ostream &os,
const isl_class &clazz);
void print_constructors_decl(ostream &os, const isl_class &clazz);
void print_destructor_decl(ostream &os, const isl_class &clazz);
void print_ptr_decl(ostream &os, const isl_class &clazz);
void print_isa_type_template(ostream &os, int indent,
const isl_class &super);
void print_downcast_decl(ostream &os, const isl_class &clazz);
void print_ctx_decl(ostream &os);
void print_persistent_callback_prototype(ostream &os,
const isl_class &clazz, FunctionDecl *method,
bool is_declaration);
void print_persistent_callback_setter_prototype(ostream &os,
const isl_class &clazz, FunctionDecl *method,
bool is_declaration);
void print_persistent_callback_data(ostream &os, const isl_class &clazz,
FunctionDecl *method);
void print_persistent_callbacks_decl(ostream &os,
const isl_class &clazz);
void print_methods_decl(ostream &os, const isl_class &clazz);
bool next_variant(FunctionDecl *fd, std::vector<bool> &convert);
template <enum method_part>
void print_method_variants(ostream &os, const isl_class &clazz,
FunctionDecl *fd);
void print_method_group_decl(ostream &os, const isl_class &clazz,
const function_set &methods);
void print_named_method_decl(ostream &os, const isl_class &clazz,
FunctionDecl *fd, const string &name, function_kind kind,
const std::vector<bool> &convert = {});
template <enum method_part>
void print_method(ostream &os, const isl_class &clazz,
FunctionDecl *method, function_kind kind);
template <enum method_part>
void print_method(ostream &os, const isl_class &clazz,
FunctionDecl *method, function_kind kind,
const std::vector<bool> &convert);
void print_set_enum_decl(ostream &os, const isl_class &clazz,
FunctionDecl *fd, const string &name);
void print_set_enums_decl(ostream &os, const isl_class &clazz,
FunctionDecl *fd);
void print_set_enums_decl(ostream &os, const isl_class &clazz);
void print_implementations(ostream &os);
void print_class_impl(ostream &os, const isl_class &clazz);
void print_check_ptr(ostream &os, const char *ptr);
void print_check_ptr_start(ostream &os, const isl_class &clazz,
const char *ptr);
void print_check_ptr_end(ostream &os, const char *ptr);
void print_class_factory_impl(ostream &os, const isl_class &clazz);
void print_protected_constructors_impl(ostream &os,
const isl_class &clazz);
void print_public_constructors_impl(ostream &os,
const isl_class &clazz);
void print_constructors_impl(ostream &os, const isl_class &clazz);
void print_copy_assignment_impl(ostream &os, const isl_class &clazz);
void print_destructor_impl(ostream &os, const isl_class &clazz);
void print_check_no_persistent_callback(ostream &os,
const isl_class &clazz, FunctionDecl *fd);
void print_ptr_impl(ostream &os, const isl_class &clazz);
void print_downcast_impl(ostream &os, const isl_class &clazz);
void print_ctx_impl(ostream &os, const isl_class &clazz);
void print_persistent_callbacks_impl(ostream &os,
const isl_class &clazz);
void print_methods_impl(ostream &os, const isl_class &clazz);
void print_method_group_impl(ostream &os, const isl_class &clazz,
const function_set &methods);
void print_argument_validity_check(ostream &os, FunctionDecl *method,
function_kind kind);
void print_save_ctx(ostream &os, FunctionDecl *method,
function_kind kind);
void print_on_error_continue(ostream &os);
void print_exceptional_execution_check(ostream &os,
const isl_class &clazz, FunctionDecl *method,
function_kind kind);
void print_set_persistent_callback(ostream &os, const isl_class &clazz,
FunctionDecl *method, function_kind kind);
void print_method_return(ostream &os, const isl_class &clazz,
FunctionDecl *method);
void print_set_enum_impl(ostream &os, const isl_class &clazz,
FunctionDecl *fd, const string &enum_name,
const string &method_name);
void print_set_enums_impl(ostream &os, const isl_class &clazz,
FunctionDecl *fd);
void print_set_enums_impl(ostream &os, const isl_class &clazz);
template <enum method_part>
void print_get_method(ostream &os, const isl_class &clazz,
FunctionDecl *fd);
void print_invalid(ostream &os, int indent, const char *msg,
const char *checked_code);
void print_stream_insertion(ostream &os, const isl_class &clazz);
void print_method_param_use(ostream &os, ParmVarDecl *param,
bool load_from_this_ptr);
std::string get_return_type(const isl_class &clazz, FunctionDecl *fd);
ParmVarDecl *get_param(FunctionDecl *fd, int pos,
const std::vector<bool> &convert);
void print_method_header(ostream &os, const isl_class &clazz,
FunctionDecl *method, const string &cname, int num_params,
bool is_declaration, function_kind kind,
const std::vector<bool> &convert = {});
void print_named_method_header(ostream &os, const isl_class &clazz,
FunctionDecl *method, string name, bool is_declaration,
function_kind kind, const std::vector<bool> &convert = {});
void print_method_header(ostream &os, const isl_class &clazz,
FunctionDecl *method, bool is_declaration, function_kind kind);
string generate_callback_args(QualType type, bool cpp);
string generate_callback_type(QualType type);
void print_wrapped_call_checked(std::ostream &os, int indent,
const std::string &call);
void print_wrapped_call(std::ostream &os, int indent,
const std::string &call, QualType rtype);
void print_callback_data_decl(ostream &os, ParmVarDecl *param,
const string &name);
void print_callback_body(ostream &os, int indent, ParmVarDecl *param,
const string &name);
void print_callback_local(ostream &os, ParmVarDecl *param);
std::string rename_method(std::string name);
string isl_bool2cpp();
string isl_namespace();
string type2cpp(QualType type);
bool is_implicit_conversion(const isl_class &clazz, FunctionDecl *cons);
bool is_subclass(QualType subclass_type, const isl_class &class_type);
function_kind get_method_kind(const isl_class &clazz,
FunctionDecl *method);
public:
static string type2cpp(const isl_class &clazz);
static string type2cpp(string type_string);
};