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