xref: /llvm-project/polly/lib/External/isl/interface/plain_cpp.h (revision a749e09e184b2b0b6dde71af01c82dd427b3e3e2)
13f9bf9f4Spatacca #ifndef ISL_INTERFACE_PLAIN_CPP_H
23f9bf9f4Spatacca #define ISL_INTERFACE_PLAIN_CPP_H
33f9bf9f4Spatacca 
43f9bf9f4Spatacca #include <functional>
53f9bf9f4Spatacca #include <memory>
63f9bf9f4Spatacca 
73f9bf9f4Spatacca #include "cpp.h"
83f9bf9f4Spatacca #include "generator.h"
93f9bf9f4Spatacca 
103f9bf9f4Spatacca using namespace std;
113f9bf9f4Spatacca using namespace clang;
123f9bf9f4Spatacca 
133f9bf9f4Spatacca /* A type printer for converting argument and return types
143f9bf9f4Spatacca  * to string representations of the corresponding types
153f9bf9f4Spatacca  * in the checked C++ interface.
163f9bf9f4Spatacca  */
173f9bf9f4Spatacca struct checked_cpp_type_printer : public cpp_type_printer {
183f9bf9f4Spatacca 	virtual std::string isl_bool() const override;
193f9bf9f4Spatacca 	virtual std::string isl_stat() const override;
203f9bf9f4Spatacca 	virtual std::string isl_size() const override;
213f9bf9f4Spatacca 	virtual std::string isl_namespace() const override;
223f9bf9f4Spatacca };
233f9bf9f4Spatacca 
243f9bf9f4Spatacca /* Generator for plain C++ bindings.
253f9bf9f4Spatacca  *
263f9bf9f4Spatacca  * "checked" is set if C++ bindings should be generated
273f9bf9f4Spatacca  * that rely on the user to check for error conditions.
283f9bf9f4Spatacca  */
293f9bf9f4Spatacca class plain_cpp_generator : public cpp_generator {
303f9bf9f4Spatacca 	struct plain_printer;
313f9bf9f4Spatacca 	struct decl_printer;
323f9bf9f4Spatacca 	struct impl_printer;
333f9bf9f4Spatacca protected:
343f9bf9f4Spatacca 	bool checked;
353f9bf9f4Spatacca public:
363f9bf9f4Spatacca 	plain_cpp_generator(SourceManager &SM,
373f9bf9f4Spatacca 		set<RecordDecl *> &exported_types,
383f9bf9f4Spatacca 		set<FunctionDecl *> exported_functions,
393f9bf9f4Spatacca 		set<FunctionDecl *> functions,
403f9bf9f4Spatacca 		bool checked = false);
413f9bf9f4Spatacca 
423f9bf9f4Spatacca 	virtual void generate();
433f9bf9f4Spatacca private:
443f9bf9f4Spatacca 	void print_forward_declarations(ostream &os);
453f9bf9f4Spatacca 	void print_declarations(ostream &os);
463f9bf9f4Spatacca 	void print_class(ostream &os, const isl_class &clazz);
473f9bf9f4Spatacca 	void print_class_forward_decl(ostream &os, const isl_class &clazz);
483f9bf9f4Spatacca 	void print_implementations(ostream &os);
493f9bf9f4Spatacca 	void print_class_impl(ostream &os, const isl_class &clazz);
503f9bf9f4Spatacca 	void print_check_no_persistent_callback(ostream &os,
513f9bf9f4Spatacca 		const isl_class &clazz, FunctionDecl *fd);
523f9bf9f4Spatacca 	void print_invalid(ostream &os, int indent, const char *msg,
533f9bf9f4Spatacca 		const char *checked_code);
543f9bf9f4Spatacca 	void print_method_param_use(ostream &os, ParmVarDecl *param,
553f9bf9f4Spatacca 		bool load_from_this_ptr);
563f9bf9f4Spatacca 	std::unique_ptr<cpp_type_printer> type_printer();
573f9bf9f4Spatacca 	std::string get_return_type(const Method &method);
583f9bf9f4Spatacca 	string generate_callback_args(QualType type, bool cpp);
593f9bf9f4Spatacca 	string generate_callback_type(QualType type);
603f9bf9f4Spatacca 	string isl_bool2cpp();
613f9bf9f4Spatacca 	string isl_namespace();
623f9bf9f4Spatacca 	string param2cpp(QualType type);
633f9bf9f4Spatacca };
643f9bf9f4Spatacca 
653f9bf9f4Spatacca /* A helper class for printing method declarations and definitions
663f9bf9f4Spatacca  * of a class for the plain C++ interface.
673f9bf9f4Spatacca  *
683f9bf9f4Spatacca  * "generator" is the C++ interface generator printing the classes.
693f9bf9f4Spatacca  */
703f9bf9f4Spatacca struct plain_cpp_generator::plain_printer : public cpp_generator::class_printer {
713f9bf9f4Spatacca 	plain_cpp_generator &generator;
723f9bf9f4Spatacca 
plain_printerplain_printer733f9bf9f4Spatacca 	plain_printer(std::ostream &os, const isl_class &clazz,
743f9bf9f4Spatacca 			plain_cpp_generator &generator, bool is_declaration) :
753f9bf9f4Spatacca 		class_printer(os, clazz, generator, is_declaration),
763f9bf9f4Spatacca 		generator(generator) {}
773f9bf9f4Spatacca 
783f9bf9f4Spatacca 	void print_persistent_callback_prototype(FunctionDecl *method);
793f9bf9f4Spatacca 	void print_persistent_callback_setter_prototype(FunctionDecl *method);
803f9bf9f4Spatacca 	void print_full_method_header(const Method &method);
813f9bf9f4Spatacca 	void print_callback_data_decl(ParmVarDecl *param, const string &name);
823f9bf9f4Spatacca 	virtual bool want_descendent_overloads(const function_set &methods)
833f9bf9f4Spatacca 		override;
84*a749e09eSMichael Kruse 	virtual void print_public_constructors() = 0;
85*a749e09eSMichael Kruse 	virtual void print_copy_assignment() = 0;
86*a749e09eSMichael Kruse 	virtual void print_destructor() = 0;
87*a749e09eSMichael Kruse 	virtual void print_ptr() = 0;
88*a749e09eSMichael Kruse 	virtual void print_downcast() = 0;
89*a749e09eSMichael Kruse 	virtual void print_ctx() = 0;
90*a749e09eSMichael Kruse 	virtual void print_method_separator() = 0;
91*a749e09eSMichael Kruse 	virtual void print_persistent_callbacks() = 0;
92*a749e09eSMichael Kruse 	void print_public_methods();
93*a749e09eSMichael Kruse 	void print_id_constructor_user_header();
94*a749e09eSMichael Kruse 	void print_id_user_header(bool optional);
95*a749e09eSMichael Kruse 	virtual void print_id_constructor_user() = 0;
96*a749e09eSMichael Kruse 	virtual void print_id_user(bool optional) = 0;
97*a749e09eSMichael Kruse 	void print_special_id();
98*a749e09eSMichael Kruse 	void print_special();
993f9bf9f4Spatacca };
1003f9bf9f4Spatacca 
1013f9bf9f4Spatacca /* A helper class for printing method declarations of a class.
1023f9bf9f4Spatacca  */
1033f9bf9f4Spatacca struct plain_cpp_generator::decl_printer :
1043f9bf9f4Spatacca 	public plain_cpp_generator::plain_printer
1053f9bf9f4Spatacca {
decl_printerdecl_printer1063f9bf9f4Spatacca 	decl_printer(std::ostream &os, const isl_class &clazz,
1073f9bf9f4Spatacca 			plain_cpp_generator &generator) :
1083f9bf9f4Spatacca 		plain_printer(os, clazz, generator, true) {}
1093f9bf9f4Spatacca 
1103f9bf9f4Spatacca 	void print_subclass_type();
1113f9bf9f4Spatacca 	void print_class_factory(const std::string &prefix = std::string());
1123f9bf9f4Spatacca 	void print_protected_constructors();
113*a749e09eSMichael Kruse 	virtual void print_copy_assignment() override;
114*a749e09eSMichael Kruse 	virtual void print_public_constructors() override;
115*a749e09eSMichael Kruse 	virtual void print_destructor() override;
116*a749e09eSMichael Kruse 	virtual void print_ptr() override;
1173f9bf9f4Spatacca 	void print_isa_type_template(int indent, const isl_class &super);
118*a749e09eSMichael Kruse 	virtual void print_downcast() override;
119*a749e09eSMichael Kruse 	virtual void print_ctx() override;
120*a749e09eSMichael Kruse 	virtual void print_method_separator() override;
1213f9bf9f4Spatacca 	void print_persistent_callback_data(FunctionDecl *method);
122*a749e09eSMichael Kruse 	virtual void print_persistent_callbacks() override;
1233f9bf9f4Spatacca 	virtual void print_method(const Method &method) override;
1243f9bf9f4Spatacca 	virtual void print_method(const ConversionMethod &method) override;
1253f9bf9f4Spatacca 	virtual void print_get_method(FunctionDecl *fd) override;
126*a749e09eSMichael Kruse 	virtual void print_id_constructor_user() override;
127*a749e09eSMichael Kruse 	virtual void print_id_user(bool optional) override;
1283f9bf9f4Spatacca };
1293f9bf9f4Spatacca 
1303f9bf9f4Spatacca /* A helper class for printing method definitions of a class.
1313f9bf9f4Spatacca  */
1323f9bf9f4Spatacca struct plain_cpp_generator::impl_printer :
1333f9bf9f4Spatacca 	public plain_cpp_generator::plain_printer
1343f9bf9f4Spatacca {
impl_printerimpl_printer1353f9bf9f4Spatacca 	impl_printer(std::ostream &os, const isl_class &clazz,
1363f9bf9f4Spatacca 			plain_cpp_generator &generator) :
1373f9bf9f4Spatacca 		plain_printer(os, clazz, generator, false) {}
1383f9bf9f4Spatacca 
1393f9bf9f4Spatacca 	void print_arg_conversion(ParmVarDecl *dst, ParmVarDecl *src);
1403f9bf9f4Spatacca 	virtual void print_method(const Method &method) override;
1413f9bf9f4Spatacca 	virtual void print_method(const ConversionMethod &method) override;
1423f9bf9f4Spatacca 	virtual void print_get_method(FunctionDecl *fd) override;
1433f9bf9f4Spatacca 	void print_check_ptr(const char *ptr);
1443f9bf9f4Spatacca 	void print_check_ptr_start(const char *ptr);
1453f9bf9f4Spatacca 	void print_check_ptr_end(const char *ptr);
1463f9bf9f4Spatacca 	void print_class_factory();
1473f9bf9f4Spatacca 	void print_protected_constructors();
148*a749e09eSMichael Kruse 	virtual void print_public_constructors() override;
149*a749e09eSMichael Kruse 	virtual void print_copy_assignment() override;
150*a749e09eSMichael Kruse 	virtual void print_destructor() override;
151*a749e09eSMichael Kruse 	virtual void print_ptr() override;
152*a749e09eSMichael Kruse 	virtual void print_downcast() override;
153*a749e09eSMichael Kruse 	virtual void print_ctx() override;
154*a749e09eSMichael Kruse 	virtual void print_method_separator() override;
1553f9bf9f4Spatacca 	void print_set_persistent_callback(const Method &method);
156*a749e09eSMichael Kruse 	virtual void print_persistent_callbacks() override;
1573f9bf9f4Spatacca 	void print_argument_validity_check(const Method &method);
158*a749e09eSMichael Kruse 	void print_save_ctx(const std::string &ctx);
1593f9bf9f4Spatacca 	void print_save_ctx(const Method &method);
1603f9bf9f4Spatacca 	void print_on_error_continue();
1613f9bf9f4Spatacca 	void print_exceptional_execution_check(const Method &method);
1623f9bf9f4Spatacca 	void print_method_return(const Method &method);
1633f9bf9f4Spatacca 	void print_stream_insertion();
1643f9bf9f4Spatacca 	void print_wrapped_call_checked(int indent, const std::string &call);
1653f9bf9f4Spatacca 	void print_wrapped_call(int indent, const std::string &call,
1663f9bf9f4Spatacca 		QualType rtype);
1673f9bf9f4Spatacca 	void print_callback_body(int indent, ParmVarDecl *param,
1683f9bf9f4Spatacca 		const string &name);
1693f9bf9f4Spatacca 	void print_callback_local(ParmVarDecl *param);
170*a749e09eSMichael Kruse 	virtual void print_id_constructor_user() override;
171*a749e09eSMichael Kruse 	virtual void print_id_user(bool optional) override;
1723f9bf9f4Spatacca };
1733f9bf9f4Spatacca 
1743f9bf9f4Spatacca #endif
175