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
7namespace taichi::lang {
8class CCProgramImpl;
9namespace cccp {
10
11class CCLayout;
12
13class 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