xref: /netbsd-src/external/mit/isl/dist/interface/plain_cpp.h (revision 5971e316fdea024efff6be8f03536623db06833e)
1*5971e316Smrg #ifndef ISL_INTERFACE_PLAIN_CPP_H
2*5971e316Smrg #define ISL_INTERFACE_PLAIN_CPP_H
3*5971e316Smrg 
4*5971e316Smrg #include <functional>
5*5971e316Smrg #include <memory>
6*5971e316Smrg 
7*5971e316Smrg #include "cpp.h"
8*5971e316Smrg #include "generator.h"
9*5971e316Smrg 
10*5971e316Smrg using namespace std;
11*5971e316Smrg using namespace clang;
12*5971e316Smrg 
13*5971e316Smrg /* A type printer for converting argument and return types
14*5971e316Smrg  * to string representations of the corresponding types
15*5971e316Smrg  * in the checked C++ interface.
16*5971e316Smrg  */
17*5971e316Smrg struct checked_cpp_type_printer : public cpp_type_printer {
18*5971e316Smrg 	virtual std::string isl_bool() const override;
19*5971e316Smrg 	virtual std::string isl_stat() const override;
20*5971e316Smrg 	virtual std::string isl_size() const override;
21*5971e316Smrg 	virtual std::string isl_namespace() const override;
22*5971e316Smrg };
23*5971e316Smrg 
24*5971e316Smrg /* Generator for plain C++ bindings.
25*5971e316Smrg  *
26*5971e316Smrg  * "checked" is set if C++ bindings should be generated
27*5971e316Smrg  * that rely on the user to check for error conditions.
28*5971e316Smrg  */
29*5971e316Smrg class plain_cpp_generator : public cpp_generator {
30*5971e316Smrg 	struct plain_printer;
31*5971e316Smrg 	struct decl_printer;
32*5971e316Smrg 	struct impl_printer;
33*5971e316Smrg protected:
34*5971e316Smrg 	bool checked;
35*5971e316Smrg public:
36*5971e316Smrg 	plain_cpp_generator(SourceManager &SM,
37*5971e316Smrg 		set<RecordDecl *> &exported_types,
38*5971e316Smrg 		set<FunctionDecl *> exported_functions,
39*5971e316Smrg 		set<FunctionDecl *> functions,
40*5971e316Smrg 		bool checked = false);
41*5971e316Smrg 
42*5971e316Smrg 	virtual void generate();
43*5971e316Smrg private:
44*5971e316Smrg 	void print_forward_declarations(ostream &os);
45*5971e316Smrg 	void print_declarations(ostream &os);
46*5971e316Smrg 	void print_class(ostream &os, const isl_class &clazz);
47*5971e316Smrg 	void print_class_forward_decl(ostream &os, const isl_class &clazz);
48*5971e316Smrg 	void print_implementations(ostream &os);
49*5971e316Smrg 	void print_class_impl(ostream &os, const isl_class &clazz);
50*5971e316Smrg 	void print_check_no_persistent_callback(ostream &os,
51*5971e316Smrg 		const isl_class &clazz, FunctionDecl *fd);
52*5971e316Smrg 	void print_invalid(ostream &os, int indent, const char *msg,
53*5971e316Smrg 		const char *checked_code);
54*5971e316Smrg 	void print_method_param_use(ostream &os, ParmVarDecl *param,
55*5971e316Smrg 		bool load_from_this_ptr);
56*5971e316Smrg 	std::unique_ptr<cpp_type_printer> type_printer();
57*5971e316Smrg 	std::string get_return_type(const Method &method);
58*5971e316Smrg 	string generate_callback_args(QualType type, bool cpp);
59*5971e316Smrg 	string generate_callback_type(QualType type);
60*5971e316Smrg 	string isl_bool2cpp();
61*5971e316Smrg 	string isl_namespace();
62*5971e316Smrg 	string param2cpp(QualType type);
63*5971e316Smrg };
64*5971e316Smrg 
65*5971e316Smrg /* A helper class for printing method declarations and definitions
66*5971e316Smrg  * of a class for the plain C++ interface.
67*5971e316Smrg  *
68*5971e316Smrg  * "generator" is the C++ interface generator printing the classes.
69*5971e316Smrg  */
70*5971e316Smrg struct plain_cpp_generator::plain_printer : public cpp_generator::class_printer {
71*5971e316Smrg 	plain_cpp_generator &generator;
72*5971e316Smrg 
plain_printerplain_printer73*5971e316Smrg 	plain_printer(std::ostream &os, const isl_class &clazz,
74*5971e316Smrg 			plain_cpp_generator &generator, bool is_declaration) :
75*5971e316Smrg 		class_printer(os, clazz, generator, is_declaration),
76*5971e316Smrg 		generator(generator) {}
77*5971e316Smrg 
78*5971e316Smrg 	void print_persistent_callback_prototype(FunctionDecl *method);
79*5971e316Smrg 	void print_persistent_callback_setter_prototype(FunctionDecl *method);
80*5971e316Smrg 	void print_full_method_header(const Method &method);
81*5971e316Smrg 	void print_callback_data_decl(ParmVarDecl *param, const string &name);
82*5971e316Smrg 	virtual bool want_descendent_overloads(const function_set &methods)
83*5971e316Smrg 		override;
84*5971e316Smrg 	virtual void print_public_constructors() = 0;
85*5971e316Smrg 	virtual void print_copy_assignment() = 0;
86*5971e316Smrg 	virtual void print_destructor() = 0;
87*5971e316Smrg 	virtual void print_ptr() = 0;
88*5971e316Smrg 	virtual void print_downcast() = 0;
89*5971e316Smrg 	virtual void print_ctx() = 0;
90*5971e316Smrg 	virtual void print_method_separator() = 0;
91*5971e316Smrg 	virtual void print_persistent_callbacks() = 0;
92*5971e316Smrg 	void print_public_methods();
93*5971e316Smrg 	void print_id_constructor_user_header();
94*5971e316Smrg 	void print_id_user_header(bool optional);
95*5971e316Smrg 	virtual void print_id_constructor_user() = 0;
96*5971e316Smrg 	virtual void print_id_user(bool optional) = 0;
97*5971e316Smrg 	void print_special_id();
98*5971e316Smrg 	void print_special();
99*5971e316Smrg };
100*5971e316Smrg 
101*5971e316Smrg /* A helper class for printing method declarations of a class.
102*5971e316Smrg  */
103*5971e316Smrg struct plain_cpp_generator::decl_printer :
104*5971e316Smrg 	public plain_cpp_generator::plain_printer
105*5971e316Smrg {
decl_printerdecl_printer106*5971e316Smrg 	decl_printer(std::ostream &os, const isl_class &clazz,
107*5971e316Smrg 			plain_cpp_generator &generator) :
108*5971e316Smrg 		plain_printer(os, clazz, generator, true) {}
109*5971e316Smrg 
110*5971e316Smrg 	void print_subclass_type();
111*5971e316Smrg 	void print_class_factory(const std::string &prefix = std::string());
112*5971e316Smrg 	void print_protected_constructors();
113*5971e316Smrg 	virtual void print_copy_assignment() override;
114*5971e316Smrg 	virtual void print_public_constructors() override;
115*5971e316Smrg 	virtual void print_destructor() override;
116*5971e316Smrg 	virtual void print_ptr() override;
117*5971e316Smrg 	void print_isa_type_template(int indent, const isl_class &super);
118*5971e316Smrg 	virtual void print_downcast() override;
119*5971e316Smrg 	virtual void print_ctx() override;
120*5971e316Smrg 	virtual void print_method_separator() override;
121*5971e316Smrg 	void print_persistent_callback_data(FunctionDecl *method);
122*5971e316Smrg 	virtual void print_persistent_callbacks() override;
123*5971e316Smrg 	virtual void print_method(const Method &method) override;
124*5971e316Smrg 	virtual void print_method(const ConversionMethod &method) override;
125*5971e316Smrg 	virtual void print_get_method(FunctionDecl *fd) override;
126*5971e316Smrg 	virtual void print_id_constructor_user() override;
127*5971e316Smrg 	virtual void print_id_user(bool optional) override;
128*5971e316Smrg };
129*5971e316Smrg 
130*5971e316Smrg /* A helper class for printing method definitions of a class.
131*5971e316Smrg  */
132*5971e316Smrg struct plain_cpp_generator::impl_printer :
133*5971e316Smrg 	public plain_cpp_generator::plain_printer
134*5971e316Smrg {
impl_printerimpl_printer135*5971e316Smrg 	impl_printer(std::ostream &os, const isl_class &clazz,
136*5971e316Smrg 			plain_cpp_generator &generator) :
137*5971e316Smrg 		plain_printer(os, clazz, generator, false) {}
138*5971e316Smrg 
139*5971e316Smrg 	void print_arg_conversion(ParmVarDecl *dst, ParmVarDecl *src);
140*5971e316Smrg 	virtual void print_method(const Method &method) override;
141*5971e316Smrg 	virtual void print_method(const ConversionMethod &method) override;
142*5971e316Smrg 	virtual void print_get_method(FunctionDecl *fd) override;
143*5971e316Smrg 	void print_check_ptr(const char *ptr);
144*5971e316Smrg 	void print_check_ptr_start(const char *ptr);
145*5971e316Smrg 	void print_check_ptr_end(const char *ptr);
146*5971e316Smrg 	void print_class_factory();
147*5971e316Smrg 	void print_protected_constructors();
148*5971e316Smrg 	virtual void print_public_constructors() override;
149*5971e316Smrg 	virtual void print_copy_assignment() override;
150*5971e316Smrg 	virtual void print_destructor() override;
151*5971e316Smrg 	virtual void print_ptr() override;
152*5971e316Smrg 	virtual void print_downcast() override;
153*5971e316Smrg 	virtual void print_ctx() override;
154*5971e316Smrg 	virtual void print_method_separator() override;
155*5971e316Smrg 	void print_set_persistent_callback(const Method &method);
156*5971e316Smrg 	virtual void print_persistent_callbacks() override;
157*5971e316Smrg 	void print_argument_validity_check(const Method &method);
158*5971e316Smrg 	void print_save_ctx(const std::string &ctx);
159*5971e316Smrg 	void print_save_ctx(const Method &method);
160*5971e316Smrg 	void print_on_error_continue();
161*5971e316Smrg 	void print_exceptional_execution_check(const Method &method);
162*5971e316Smrg 	void print_method_return(const Method &method);
163*5971e316Smrg 	void print_stream_insertion();
164*5971e316Smrg 	void print_wrapped_call_checked(int indent, const std::string &call);
165*5971e316Smrg 	void print_wrapped_call(int indent, const std::string &call,
166*5971e316Smrg 		QualType rtype);
167*5971e316Smrg 	void print_callback_body(int indent, ParmVarDecl *param,
168*5971e316Smrg 		const string &name);
169*5971e316Smrg 	void print_callback_local(ParmVarDecl *param);
170*5971e316Smrg 	virtual void print_id_constructor_user() override;
171*5971e316Smrg 	virtual void print_id_user(bool optional) override;
172*5971e316Smrg };
173*5971e316Smrg 
174*5971e316Smrg #endif
175