14 std::vector<std::string>
15 TranslationUnit::Compile(
const std::string& header_filename)
const {
16 std::string header_basename
17 = common::filesystem::GetBasename(header_filename);
18 std::vector<std::string> lines{std::string(
"#include \"")
19 + header_basename +
"\"",
""};
20 auto preamble_lines = preamble->Compile();
21 if (preamble_lines.size() > 0) {
22 common::TransformPushBack(&lines, preamble_lines,
23 [] (std::string line) {
28 common::TransformPushBack(&lines, body->Compile(),
29 [] (std::string line) {
35 std::vector<std::string>
36 PlainBlock::Compile()
const {
40 std::vector<std::string>
41 FunctionBlock::Compile()
const {
42 std::vector<std::string> ret{prototype +
" {"};
43 common::TransformPushBack(&ret, body->Compile(), [] (std::string line) {
46 ret.emplace_back(
"}");
51 std::vector<std::string>
52 SequenceBlock::Compile()
const {
53 std::vector<std::string> ret;
54 for (
const auto& block : sequence) {
55 common::TransformPushBack(&ret, block->Compile(), [] (std::string line) {
63 SequenceBlock::Reserve(
size_t size) {
64 sequence.reserve(size);
68 SequenceBlock::PushBack(
const CodeBlock& block) {
69 sequence.emplace_back(block);
73 SequenceBlock::PushBack(CodeBlock&& block) {
74 sequence.push_back(DeepCopyUniquePtr<CodeBlock>(std::move(block)));
77 std::vector<std::string>
78 IfElseBlock::Compile()
const {
79 std::vector<std::string> ret;
81 if (branch_hint == BranchHint::kNone) {
82 ret.push_back(std::string(
"if (") + condition->Compile() +
") {");
84 const std::string tag =
85 (branch_hint == BranchHint::kLikely) ?
"LIKELY" :
"UNLIKELY";
86 ret.push_back(std::string(
"if ( ") + tag +
"( " 87 + condition->Compile() +
" ) ) {");
89 common::TransformPushBack(&ret, if_block->Compile(), [] (std::string line) {
92 ret.emplace_back(
"} else {");
93 common::TransformPushBack(&ret, else_block->Compile(), [] (std::string line) {
96 ret.emplace_back(
"}");
Cross-platform wrapper for common filesystem functions.
Building blocks for semantic model of tree prediction code.