1 #ifndef ISL_INTERFACE_CPP_H
2 #define ISL_INTERFACE_CPP_H
10 /* A generated C++ method derived from an isl function.
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 different
15 * from the default name derived from "fd".
16 * "kind" is the type of the method.
17 * "callbacks" stores the callback arguments.
27 static list_combiner
print_combiner(std::ostream
&os
);
28 static list_combiner
empty_combiner();
30 Method(const isl_class
&clazz
, FunctionDecl
*fd
,
31 const std::string
&name
);
32 Method(const isl_class
&clazz
, FunctionDecl
*fd
);
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;
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;
57 const isl_class
&clazz
;
58 FunctionDecl
*const fd
;
59 const std::string name
;
61 const std::vector
<ParmVarDecl
*> callbacks
;
64 /* A data structure expressing how Method::on_arg_list should combine
67 * In particular, "before" is called before any argument is handled;
68 * "between" is called between two arguments and
69 * "after" is called after all arguments have been handled.
71 struct Method::list_combiner
{
72 const std::function
<void()> before
;
73 const std::function
<void()> between
;
74 const std::function
<void()> after
;
77 /* A method that does not require its isl type parameters to be a copy.
79 struct NoCopyMethod
: Method
{
80 NoCopyMethod(const Method
&method
) : Method(method
) {}
82 virtual bool param_needs_copy(int pos
) const override
;
85 /* A generated method that performs one or more argument conversions and
86 * then calls the original method.
88 * A ConversionMethod inherits from a NoCopyMethod, because
89 * 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.
93 * "this_type" is the name of the type to which "this" should be converted
94 * (if different from clazz.name).
95 * "get_param_fn" returns the method argument at position "pos".
97 struct 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
;
105 void print_call(std::ostream
&os
, const std::string
&ns
) const;
107 const std::string this_type
;
108 const std::function
<clang::ParmVarDecl
*(int pos
)> get_param_fn
;
111 /* A specialized generated C++ method for setting an enum.
113 * "enum_name" is a string representation of the enum value
114 * set by this method.
116 struct EnumMethod
: public Method
{
117 EnumMethod(const isl_class
&clazz
, FunctionDecl
*fd
,
118 const std::string
&method_name
, const std::string
&enum_name
);
120 virtual int num_params() const override
;
121 virtual void print_param_use(ostream
&os
, int pos
) const override
;
123 std::string enum_name
;
126 /* A type printer for converting argument and return types,
127 * as well as the class type,
128 * to string representations of the corresponding types
129 * in the C++ interface.
131 struct cpp_type_printer
{
132 cpp_type_printer() {}
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
)
141 std::string
isl_type(int arg
, QualType type
) const;
142 std::string
generate_callback_args(int arg
, QualType type
, bool cpp
)
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;
149 /* Generator for C++ bindings.
151 class cpp_generator
: public generator
{
153 struct class_printer
;
155 cpp_generator(SourceManager
&SM
, set
<RecordDecl
*> &exported_types
,
156 set
<FunctionDecl
*> exported_functions
,
157 set
<FunctionDecl
*> functions
);
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
);
169 static string
type2cpp(const isl_class
&clazz
);
170 static string
type2cpp(string type_string
);
173 /* A helper class for printing method declarations and definitions
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.
182 struct cpp_generator::class_printer
{
184 const isl_class
&clazz
;
185 const std::string cppstring
;
186 cpp_generator
&generator
;
187 const bool declarations
;
189 class_printer(std::ostream
&os
, const isl_class
&clazz
,
190 cpp_generator
&generator
, bool declarations
);
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
);