File: plain_cpp.h

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-11
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,418,840 kB
  • sloc: cpp: 5,290,826; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,898; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,913; xml: 953; cs: 573; fortran: 539
file content (152 lines) | stat: -rw-r--r-- 5,370 bytes parent folder | download | duplicates (9)
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
#ifndef ISL_INTERFACE_PLAIN_CPP_H
#define ISL_INTERFACE_PLAIN_CPP_H

#include <functional>
#include <memory>

#include "cpp.h"
#include "generator.h"

using namespace std;
using namespace clang;

/* A type printer for converting argument and return types
 * to string representations of the corresponding types
 * in the checked C++ interface.
 */
struct checked_cpp_type_printer : public cpp_type_printer {
	virtual std::string isl_bool() const override;
	virtual std::string isl_stat() const override;
	virtual std::string isl_size() const override;
	virtual std::string isl_namespace() const override;
};

/* Generator for plain C++ bindings.
 *
 * "checked" is set if C++ bindings should be generated
 * that rely on the user to check for error conditions.
 */
class plain_cpp_generator : public cpp_generator {
	struct plain_printer;
	struct decl_printer;
	struct impl_printer;
protected:
	bool checked;
public:
	plain_cpp_generator(SourceManager &SM,
		set<RecordDecl *> &exported_types,
		set<FunctionDecl *> exported_functions,
		set<FunctionDecl *> functions,
		bool checked = false);

	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_class_forward_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_no_persistent_callback(ostream &os,
		const isl_class &clazz, FunctionDecl *fd);
	void print_invalid(ostream &os, int indent, const char *msg,
		const char *checked_code);
	void print_method_param_use(ostream &os, ParmVarDecl *param,
		bool load_from_this_ptr);
	std::unique_ptr<cpp_type_printer> type_printer();
	std::string get_return_type(const Method &method);
	string generate_callback_args(QualType type, bool cpp);
	string generate_callback_type(QualType type);
	string isl_bool2cpp();
	string isl_namespace();
	string param2cpp(QualType type);
};

/* A helper class for printing method declarations and definitions
 * of a class for the plain C++ interface.
 *
 * "generator" is the C++ interface generator printing the classes.
 */
struct plain_cpp_generator::plain_printer : public cpp_generator::class_printer {
	plain_cpp_generator &generator;

	plain_printer(std::ostream &os, const isl_class &clazz,
			plain_cpp_generator &generator, bool is_declaration) :
		class_printer(os, clazz, generator, is_declaration),
		generator(generator) {}

	void print_persistent_callback_prototype(FunctionDecl *method);
	void print_persistent_callback_setter_prototype(FunctionDecl *method);
	void print_full_method_header(const Method &method);
	void print_callback_data_decl(ParmVarDecl *param, const string &name);
	virtual bool want_descendent_overloads(const function_set &methods)
		override;
};

/* A helper class for printing method declarations of a class.
 */
struct plain_cpp_generator::decl_printer :
	public plain_cpp_generator::plain_printer
{
	decl_printer(std::ostream &os, const isl_class &clazz,
			plain_cpp_generator &generator) :
		plain_printer(os, clazz, generator, true) {}

	void print_subclass_type();
	void print_class_factory(const std::string &prefix = std::string());
	void print_protected_constructors();
	void print_copy_assignment();
	void print_public_constructors();
	void print_destructor();
	void print_ptr();
	void print_isa_type_template(int indent, const isl_class &super);
	void print_downcast();
	void print_ctx();
	void print_persistent_callback_data(FunctionDecl *method);
	void print_persistent_callbacks();
	virtual void print_method(const Method &method) override;
	virtual void print_method(const ConversionMethod &method) override;
	virtual void print_get_method(FunctionDecl *fd) override;
};

/* A helper class for printing method definitions of a class.
 */
struct plain_cpp_generator::impl_printer :
	public plain_cpp_generator::plain_printer
{
	impl_printer(std::ostream &os, const isl_class &clazz,
			plain_cpp_generator &generator) :
		plain_printer(os, clazz, generator, false) {}

	void print_arg_conversion(ParmVarDecl *dst, ParmVarDecl *src);
	virtual void print_method(const Method &method) override;
	virtual void print_method(const ConversionMethod &method) override;
	virtual void print_get_method(FunctionDecl *fd) override;
	void print_check_ptr(const char *ptr);
	void print_check_ptr_start(const char *ptr);
	void print_check_ptr_end(const char *ptr);
	void print_class_factory();
	void print_protected_constructors();
	void print_public_constructors();
	void print_copy_assignment();
	void print_destructor();
	void print_ptr();
	void print_downcast();
	void print_ctx();
	void print_set_persistent_callback(const Method &method);
	void print_persistent_callbacks();
	void print_argument_validity_check(const Method &method);
	void print_save_ctx(const Method &method);
	void print_on_error_continue();
	void print_exceptional_execution_check(const Method &method);
	void print_method_return(const Method &method);
	void print_stream_insertion();
	void print_wrapped_call_checked(int indent, const std::string &call);
	void print_wrapped_call(int indent, const std::string &call,
		QualType rtype);
	void print_callback_body(int indent, ParmVarDecl *param,
		const string &name);
	void print_callback_local(ParmVarDecl *param);
};

#endif