1 | #pragma once |
---|---|
2 | |
3 | #include "taichi/util/lang_util.h" |
4 | #include "taichi/util/line_appender.h" |
5 | #include "taichi/ir/snode.h" |
6 | |
7 | namespace taichi::lang { |
8 | class CCProgramImpl; |
9 | namespace cccp { |
10 | |
11 | class CCLayout; |
12 | |
13 | class CCLayoutGen { |
14 | // Generate corresponding C Source Code for Taichi Structures |
15 | public: |
16 | CCLayoutGen(CCProgramImpl *cc_program_impl, SNode *root) |
17 | : cc_program_impl_(cc_program_impl), root_(root) { |
18 | } |
19 | |
20 | std::unique_ptr<CCLayout> compile(); |
21 | |
22 | private: |
23 | void generate_children(SNode *snode); |
24 | void generate_types(SNode *snode); |
25 | |
26 | template <typename... Args> |
27 | void emit(std::string f, Args &&...args) { |
28 | line_appender_.append(std::move(f), std::move(args)...); |
29 | } |
30 | |
31 | CCProgramImpl *cc_program_impl_{nullptr}; |
32 | |
33 | SNode *root_; |
34 | std::vector<SNode *> snodes_; |
35 | LineAppender line_appender_; |
36 | }; |
37 | |
38 | } // namespace cccp |
39 | } // namespace taichi::lang |
40 |