brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · ae3315d Raw
119 lines · c
1#ifndef ISL_INTERFACE_TEMPLATE_CPP_H2#define ISL_INTERFACE_TEMPLATE_CPP_H3 4#include <initializer_list>5#include <iostream>6#include <map>7#include <memory>8#include <set>9#include <string>10#include <unordered_map>11 12#include "cpp.h"13 14struct Fixed;15 16struct TupleKind;17 18/* A shared pointer to a TupleKind.19 */20struct TupleKindPtr : public std::shared_ptr<const TupleKind> {21  using Base = std::shared_ptr<const TupleKind>;22  TupleKindPtr() = default;23  TupleKindPtr(Fixed);24  TupleKindPtr(Base base) : Base(base) {}25  TupleKindPtr(const std::string &name);26  TupleKindPtr(const TupleKindPtr &left, const TupleKindPtr &right);27};28 29/* A substitution mapping leaf tuple kind names to tuple kinds.30 */31using Substitution = std::unordered_map<std::string, TupleKindPtr>;32 33/* A representation of a (possibly improper) tuple kind.34 * That is, this also includes tuple kinds for types35 * that do not have any tuples.36 *37 * The kind could be a name (the base case) or38 * a (currently) unnamed nested pair of tuple kinds.39 */40struct TupleKind {41	TupleKind(const std::string &name) : name(name) {}42 43	virtual std::string to_string() const;44	virtual std::vector<std::string> params() const;45	virtual TupleKindPtr apply(const Substitution &subs,46		const TupleKindPtr &self) const;47	virtual TupleKindPtr left() const;48	virtual TupleKindPtr right() const;49 50	const std::string name;51};52 53/* A sequence of tuple kinds, representing a kind of objects.54 */55struct Kind : public std::vector<TupleKindPtr> {56	Kind() {}57	Kind(std::initializer_list<TupleKindPtr> list) : vector(list) {}58 59	bool is_anon() const;60	bool is_set() const;61	bool is_anon_set() const;62	std::vector<std::string> params() const;63	Kind apply(const Substitution &subs) const;64};65 66/* A representation of a template class.67 *68 * "class_name" is the name of the template class.69 * "super_name" is the (fully qualified) name of the corresponding70 * plain C++ interface class, from which this template class derives.71 * "clazz" describes the plain class.72 *73 * "class_tuples" contains the specializations.74 * It is initialized with a predefined set of specializations,75 * but may be extended during the generations of the specializations.76 */77struct template_class {78	const std::string class_name;79	const std::string super_name;80	const isl_class &clazz;81 82	std::vector<Kind> class_tuples;83 84	bool is_anon() const;85	bool is_anon_set() const;86	void add_specialization(const Kind &kind);87};88 89/* A generator for templated C++ bindings.90 *91 * "template_classes" contains all generated template classes,92 * keyed on their names.93 */94class template_cpp_generator : public cpp_generator {95	struct class_printer;96	struct method_decl_printer;97	struct method_impl_printer;98	struct class_decl_printer;99	struct class_impl_printer;100 101	void add_template_class(const isl_class &clazz, const std::string &name,102		const std::vector<Kind> &class_tuples);103public:104	template_cpp_generator(clang::SourceManager &SM,105		std::set<clang::RecordDecl *> &exported_types,106		std::set<clang::FunctionDecl *> exported_functions,107		std::set<clang::FunctionDecl *> functions);108 109	virtual void generate() override;110	void foreach_template_class(111		const std::function<void(const template_class &)> &fn) const;112	void print_forward_declarations(std::ostream &os);113	void print_friends(std::ostream &os);114 115	std::map<std::string, template_class> template_classes;116};117 118#endif119