brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · 55a8fb4 Raw
213 lines · c
1#ifndef ISL_INTERFACE_CPP_H2#define ISL_INTERFACE_CPP_H3 4#include <iostream>5#include <string>6#include <vector>7 8#include "generator.h"9 10/* A generated C++ method derived from an isl function.11 *12 * "clazz" is the class to which the method belongs.13 * "fd" is the original isl function.14 * "name" is the name of the method, which may be different15 * from the default name derived from "fd".16 * "kind" is the type of the method.17 * "callbacks" stores the callback arguments.18 */19struct Method {20	enum Kind {21		static_method,22		member_method,23		constructor,24	};25 26	struct list_combiner;27	static list_combiner print_combiner(std::ostream &os);28	static list_combiner empty_combiner();29 30	Method(const isl_class &clazz, FunctionDecl *fd,31		const std::string &name);32	Method(const isl_class &clazz, FunctionDecl *fd);33 34	int c_num_params() const;35	virtual int num_params() const;36	virtual bool param_needs_copy(int pos) const;37	virtual clang::ParmVarDecl *get_param(int pos) const;38	virtual void print_param_use(ostream &os, int pos) const;39	bool is_subclass_mutator() const;40	static void on_arg_list(int start, int end,41		const list_combiner &combiner,42		const std::function<bool(int i)> &on_arg_skip_next);43	static void print_arg_list(std::ostream &os, int start, int end,44		const std::function<bool(int i)> &print_arg_skip_next);45	void on_fd_arg_list(int start, int end,46		const list_combiner &combiner,47		const std::function<void(int i, int arg)> &on_arg) const;48	void print_fd_arg_list(std::ostream &os, int start, int end,49		const std::function<void(int i, int arg)> &print_arg) const;50	void on_cpp_arg_list(const list_combiner &combiner,51		const std::function<void(int i, int arg)> &on_arg) const;52	void on_cpp_arg_list(53		const std::function<void(int i, int arg)> &on_arg) const;54	void print_cpp_arg_list(std::ostream &os,55		const std::function<void(int i, int arg)> &print_arg) const;56 57	const isl_class &clazz;58	FunctionDecl *const fd;59	const std::string name;60	const enum Kind kind;61	const std::vector<ParmVarDecl *> callbacks;62};63 64/* A data structure expressing how Method::on_arg_list should combine65 * the arguments.66 *67 * In particular, "before" is called before any argument is handled;68 * "between" is called between two arguments and69 * "after" is called after all arguments have been handled.70 */71struct Method::list_combiner {72	const std::function<void()> before;73	const std::function<void()> between;74	const std::function<void()> after;75};76 77/* A method that does not require its isl type parameters to be a copy.78 */79struct NoCopyMethod : Method {80	NoCopyMethod(const Method &method) : Method(method) {}81 82	virtual bool param_needs_copy(int pos) const override;83};84 85/* A generated method that performs one or more argument conversions and86 * then calls the original method.87 *88 * A ConversionMethod inherits from a NoCopyMethod, because89 * unlike methods that call an isl C function,90 * a conversion method never calls release() on an isl type argument,91 * so they can all be passed as const references.92 *93 * "this_type" is the name of the type to which "this" should be converted94 * (if different from clazz.name).95 * "get_param_fn" returns the method argument at position "pos".96 */97struct ConversionMethod : NoCopyMethod {98	ConversionMethod(const Method &method, const std::string &this_type,99		const std::function<clang::ParmVarDecl *(int pos)> &get_param);100	ConversionMethod(const Method &method, const std::string &this_type);101	ConversionMethod(const Method &method,102		const std::function<clang::ParmVarDecl *(int pos)> &get_param);103	virtual clang::ParmVarDecl *get_param(int pos) const override;104 105	void print_call(std::ostream &os, const std::string &ns) const;106 107	const std::string this_type;108	const std::function<clang::ParmVarDecl *(int pos)> get_param_fn;109};110 111/* A specialized generated C++ method for setting an enum.112 *113 * "enum_name" is a string representation of the enum value114 * set by this method.115 */116struct EnumMethod : public Method {117	EnumMethod(const isl_class &clazz, FunctionDecl *fd,118		const std::string &method_name, const std::string &enum_name);119 120	virtual int num_params() const override;121	virtual void print_param_use(ostream &os, int pos) const override;122 123	std::string enum_name;124};125 126/* A type printer for converting argument and return types,127 * as well as the class type,128 * to string representations of the corresponding types129 * in the C++ interface.130 */131struct cpp_type_printer {132	cpp_type_printer() {}133 134	virtual std::string isl_bool() const;135	virtual std::string isl_stat() const;136	virtual std::string isl_size() const;137	virtual std::string isl_namespace() const;138	virtual std::string class_type(const std::string &cpp_name) const;139	virtual std::string qualified(int arg, const std::string &cpp_type)140		const;141	std::string isl_type(int arg, QualType type) const;142	std::string generate_callback_args(int arg, QualType type, bool cpp)143		const;144	std::string generate_callback_type(int arg, QualType type) const;145	std::string param(int arg, QualType type) const;146	std::string return_type(const Method &method) const;147};148 149/* Generator for C++ bindings.150 */151class cpp_generator : public generator {152protected:153	struct class_printer;154public:155	cpp_generator(SourceManager &SM, set<RecordDecl *> &exported_types,156		set<FunctionDecl *> exported_functions,157		set<FunctionDecl *> functions);158private:159	void set_class_construction_types(isl_class &clazz);160	void set_construction_types();161	void copy_methods(isl_class &clazz, const std::string &name,162		const isl_class &super, const function_set &methods);163	void copy_super_methods(isl_class &clazz, const isl_class &super);164	void copy_super_methods(isl_class &clazz, set<string> &done);165	void copy_super_methods();166	bool is_implicit_conversion(const Method &cons);167	bool is_subclass(QualType subclass_type, const isl_class &class_type);168public:169	static string type2cpp(const isl_class &clazz);170	static string type2cpp(string type_string);171};172 173/* A helper class for printing method declarations and definitions174 * of a class.175 *176 * "os" is the stream onto which the methods are printed.177 * "clazz" describes the methods of the class.178 * "cppstring" is the C++ name of the class.179 * "generator" is the C++ interface generator printing the classes.180 * "declarations" is set if this object is used to print declarations.181 */182struct cpp_generator::class_printer {183	std::ostream &os;184	const isl_class &clazz;185	const std::string cppstring;186	cpp_generator &generator;187	const bool declarations;188 189	class_printer(std::ostream &os, const isl_class &clazz,190			cpp_generator &generator, bool declarations);191 192	void print_constructors();193	void print_methods();194	bool next_variant(FunctionDecl *fd, std::vector<bool> &convert);195	void print_method_variants(FunctionDecl *fd, const std::string &name);196	virtual bool want_descendent_overloads(const function_set &methods) = 0;197	void print_descendent_overloads(FunctionDecl *fd,198		const std::string &name);199	void print_method_group(const function_set &methods,200		const std::string &name);201	virtual void print_method(const Method &method) = 0;202	virtual void print_method(const ConversionMethod &method) = 0;203	virtual void print_get_method(FunctionDecl *fd) = 0;204	void print_set_enums(FunctionDecl *fd);205	void print_set_enums();206	ParmVarDecl *get_param(FunctionDecl *fd, int pos,207		const std::vector<bool> &convert);208	void print_method_header(const Method &method,209		const cpp_type_printer &type_printer);210};211 212#endif213