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