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
|