forked from OSchip/llvm-project
153 lines
5.2 KiB
C++
153 lines
5.2 KiB
C++
#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
|