| #ifndef ISL_INTERFACE_CPP_H |
| #define ISL_INTERFACE_CPP_H |
| |
| #include <iostream> |
| #include <string> |
| #include <vector> |
| |
| #include "generator.h" |
| |
| /* A generated C++ method derived from an isl function. |
| * |
| * "clazz" is the class to which the method belongs. |
| * "fd" is the original isl function. |
| * "name" is the name of the method, which may be different |
| * from the default name derived from "fd". |
| * "kind" is the type of the method. |
| * "callback" stores the callback argument, if any, or NULL. |
| */ |
| struct Method { |
| enum Kind { |
| static_method, |
| member_method, |
| constructor, |
| }; |
| |
| Method(const isl_class &clazz, FunctionDecl *fd, |
| const std::string &name); |
| Method(const isl_class &clazz, FunctionDecl *fd); |
| |
| int c_num_params() const; |
| virtual int num_params() const; |
| virtual bool param_needs_copy(int pos) const; |
| virtual clang::ParmVarDecl *get_param(int pos) const; |
| virtual void print_param_use(ostream &os, int pos) const; |
| bool is_subclass_mutator() const; |
| static void print_arg_list(std::ostream &os, int start, int end, |
| const std::function<void(int i)> &print_arg); |
| void print_cpp_arg_list(std::ostream &os, |
| const std::function<void(int i)> &print_arg) const; |
| |
| const isl_class &clazz; |
| FunctionDecl *const fd; |
| const std::string name; |
| const enum Kind kind; |
| ParmVarDecl *const callback; |
| }; |
| |
| /* A method that does not require its isl type parameters to be a copy. |
| */ |
| struct NoCopyMethod : Method { |
| NoCopyMethod(const Method &method) : Method(method) {} |
| |
| virtual bool param_needs_copy(int pos) const override; |
| }; |
| |
| /* A generated method that performs one or more argument conversions and |
| * then calls the original method. |
| * |
| * A ConversionMethod inherits from a NoCopyMethod, because |
| * unlike methods that call an isl C function, |
| * a conversion method never calls release() on an isl type argument, |
| * so they can all be passed as const references. |
| * |
| * "this_type" is the name of the type to which "this" should be converted |
| * (if different from clazz.name). |
| * "get_param_fn" returns the method argument at position "pos". |
| */ |
| struct ConversionMethod : NoCopyMethod { |
| ConversionMethod(const Method &method, const std::string &this_type, |
| const std::function<clang::ParmVarDecl *(int pos)> &get_param); |
| ConversionMethod(const Method &method, const std::string &this_type); |
| ConversionMethod(const Method &method, |
| const std::function<clang::ParmVarDecl *(int pos)> &get_param); |
| virtual clang::ParmVarDecl *get_param(int pos) const override; |
| |
| void print_call(std::ostream &os, const std::string &ns) const; |
| |
| const std::string this_type; |
| const std::function<clang::ParmVarDecl *(int pos)> get_param_fn; |
| }; |
| |
| /* A specialized generated C++ method for setting an enum. |
| * |
| * "enum_name" is a string representation of the enum value |
| * set by this method. |
| */ |
| struct EnumMethod : public Method { |
| EnumMethod(const isl_class &clazz, FunctionDecl *fd, |
| const std::string &method_name, const std::string &enum_name); |
| |
| virtual int num_params() const override; |
| virtual void print_param_use(ostream &os, int pos) const override; |
| |
| std::string enum_name; |
| }; |
| |
| /* A type printer for converting argument and return types, |
| * as well as the class type, |
| * to string representations of the corresponding types |
| * in the C++ interface. |
| */ |
| struct cpp_type_printer { |
| cpp_type_printer() {} |
| |
| virtual std::string isl_bool() const; |
| virtual std::string isl_stat() const; |
| virtual std::string isl_size() const; |
| virtual std::string isl_namespace() const; |
| virtual std::string class_type(const std::string &cpp_name) const; |
| virtual std::string qualified(int arg, const std::string &cpp_type) |
| const; |
| std::string isl_type(int arg, QualType type) const; |
| std::string generate_callback_args(int arg, QualType type, bool cpp) |
| const; |
| std::string generate_callback_type(int arg, QualType type) const; |
| std::string param(int arg, QualType type) const; |
| std::string return_type(const Method &method) const; |
| }; |
| |
| /* Generator for C++ bindings. |
| */ |
| class cpp_generator : public generator { |
| protected: |
| struct class_printer; |
| public: |
| cpp_generator(SourceManager &SM, set<RecordDecl *> &exported_types, |
| set<FunctionDecl *> exported_functions, |
| set<FunctionDecl *> functions); |
| private: |
| void set_class_construction_types(isl_class &clazz); |
| void set_construction_types(); |
| void copy_methods(isl_class &clazz, const std::string &name, |
| const isl_class &super, const function_set &methods); |
| void copy_super_methods(isl_class &clazz, const isl_class &super); |
| void copy_super_methods(isl_class &clazz, set<string> &done); |
| void copy_super_methods(); |
| bool is_implicit_conversion(const Method &cons); |
| bool is_subclass(QualType subclass_type, const isl_class &class_type); |
| public: |
| static string type2cpp(const isl_class &clazz); |
| static string type2cpp(string type_string); |
| }; |
| |
| /* A helper class for printing method declarations and definitions |
| * of a class. |
| * |
| * "os" is the stream onto which the methods are printed. |
| * "clazz" describes the methods of the class. |
| * "cppstring" is the C++ name of the class. |
| * "generator" is the C++ interface generator printing the classes. |
| * "declarations" is set if this object is used to print declarations. |
| */ |
| struct cpp_generator::class_printer { |
| std::ostream &os; |
| const isl_class &clazz; |
| const std::string cppstring; |
| cpp_generator &generator; |
| const bool declarations; |
| |
| class_printer(std::ostream &os, const isl_class &clazz, |
| cpp_generator &generator, bool declarations); |
| |
| void print_constructors(); |
| void print_methods(); |
| bool next_variant(FunctionDecl *fd, std::vector<bool> &convert); |
| void print_method_variants(FunctionDecl *fd, const std::string &name); |
| virtual bool want_descendent_overloads(const function_set &methods) = 0; |
| void print_descendent_overloads(FunctionDecl *fd, |
| const std::string &name); |
| void print_method_group(const function_set &methods, |
| const std::string &name); |
| virtual void print_method(const Method &method) = 0; |
| virtual void print_method(const ConversionMethod &method) = 0; |
| virtual void print_get_method(FunctionDecl *fd) = 0; |
| void print_set_enums(FunctionDecl *fd); |
| void print_set_enums(); |
| ParmVarDecl *get_param(FunctionDecl *fd, int pos, |
| const std::vector<bool> &convert); |
| void print_method_header(const Method &method, |
| const cpp_type_printer &type_printer); |
| }; |
| |
| #endif |