docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
code_snippet_factory.h
Go to the documentation of this file.
1#pragma once
2#include <optional>
3#include <string>
4#include <unordered_set>
5#include <vector>
6
7#include "utils.h"
8
9namespace sdfg {
10namespace codegen {
11
12inline std::string CODE_SNIPPET_INIT_ONCE = "init_once";
13inline std::string CODE_SNIPPET_DEINIT_ONCE = "deinit_once";
14
16protected:
18 std::string extension_;
20 std::string name_;
21
22public:
23 CodeSnippet(const std::string& name, const std::string& extension, bool as_file)
24 : extension_(extension), as_file_(as_file), name_(name) {};
25
27 return stream_;
28 }
29
30 const PrettyPrinter& stream() const {
31 return stream_;
32 }
33
34 const std::string& extension() const {
35 return extension_;
36 }
37
38 bool is_as_file() const {
39 return as_file_;
40 }
41
42 const std::string& name() const {
43 return name_;
44 }
45
46 std::filesystem::path filename() const {
47 return name_ + "." + extension_;
48 }
49};
50
52public:
53 virtual ~LibDependency() = default;
54 virtual std::string_view name() const = 0;
55 virtual void enumerate_includes(std::vector<std::string>& out_list) const = 0;
56 virtual std::vector<std::string_view>& globally_unique_ids() const = 0;
57};
58
60 bool used = false;
61 bool runtime_available = false;
62};
63
70protected:
71 std::unordered_map<std::string, CodeSnippet> snippets_;
72 const std::filesystem::path output_path_;
73 const std::filesystem::path header_path_;
74
75 std::unordered_set<std::string> setup_snippets_;
76 std::unordered_set<std::string> teardown_snippets_;
77 std::unordered_set<std::string> globals_snippets_;
78
79 std::unordered_map<std::string, const LibDependency*> conflicting_ids_;
80 std::unordered_map<const LibDependency*, DependencyState> dependencies_;
81
82public:
83 CodeSnippetFactory(const std::pair<std::filesystem::path, std::filesystem::path>* config = nullptr);
84
85 virtual ~CodeSnippetFactory() = default;
86
87 virtual CodeSnippet& require(const std::string& name, const std::string& extension, bool as_file);
88 CodeSnippet& require(const std::string& name, const std::string& extension) {
89 return require(name, extension, true);
90 }
91
92 std::unordered_map<std::string, CodeSnippet>::iterator find(const std::string& name);
93
94 const std::unordered_map<std::string, CodeSnippet>& snippets() const;
95
96 const std::filesystem::path& output_path() const {
97 return output_path_;
98 }
99 const std::filesystem::path& header_path() const {
100 return header_path_;
101 }
102
103 virtual void add_setup(const std::string& snippet);
104 virtual void add_teardown(const std::string& snippet);
105 virtual void add_global(const std::string& snippet);
106 virtual const std::unordered_set<std::string>& setup_snippets() const;
107 virtual const std::unordered_set<std::string>& teardown_snippets() const;
108
109 std::vector<const LibDependency*> get_used_lib_dependencies() const;
110
111 const std::unordered_set<std::string>& globals_snippets() const;
112
120
124 bool is_available(const LibDependency* dependency) const;
125
130 std::optional<std::pair<const std::string&, const LibDependency*>>
131 check_for_conflicts(const LibDependency* dependency) const;
132
137 void require_no_conflicts(const LibDependency* dependency);
138
143 bool require_dependency(const LibDependency* dependency);
144};
145
151public:
152 NestedCodeSnippetFactory(const std::pair<std::filesystem::path, std::filesystem::path>* config = nullptr);
153
154 CodeSnippet& require(const std::string& name, const std::string& extension, bool as_file) override {
155 throw std::runtime_error("NestedCodeSnippetFactory does not support nested snippets");
156 }
157
158 void add_setup(const std::string& snippet) override {
159 throw std::runtime_error("Unsupported on NestedCodeSnippetFactory");
160 }
161 void add_teardown(const std::string& snippet) override {
162 throw std::runtime_error("Unsupported on NestedCodeSnippetFactory");
163 }
164 void add_global(const std::string& snippet) override {
165 throw std::runtime_error("Unsupported on NestedCodeSnippetFactory");
166 }
167 const std::unordered_set<std::string>& setup_snippets() const override {
168 throw std::runtime_error("Unsupported on NestedCodeSnippetFactory");
169 }
170 const std::unordered_set<std::string>& teardown_snippets() const override {
171 throw std::runtime_error("Unsupported on NestedCodeSnippetFactory");
172 }
173};
174
175
176} // namespace codegen
177} // namespace sdfg
void require_no_conflicts(const LibDependency *dependency)
Adds conflicts of this dependency to the list, throws if conflicts exist Warning: not transactional f...
void add_available_dependency(const LibDependency *dependency)
For the generation process to declare discovered runtime dependencies before the codegen starts.
std::unordered_set< std::string > setup_snippets_
Definition code_snippet_factory.h:75
const std::unordered_set< std::string > & globals_snippets() const
std::unordered_set< std::string > globals_snippets_
Definition code_snippet_factory.h:77
virtual ~CodeSnippetFactory()=default
std::optional< std::pair< const std::string &, const LibDependency * > > check_for_conflicts(const LibDependency *dependency) const
Checks if this dependency would conflict with existing ones.
CodeSnippetFactory(const std::pair< std::filesystem::path, std::filesystem::path > *config=nullptr)
std::vector< const LibDependency * > get_used_lib_dependencies() const
virtual const std::unordered_set< std::string > & teardown_snippets() const
virtual void add_teardown(const std::string &snippet)
const std::filesystem::path header_path_
Definition code_snippet_factory.h:73
std::unordered_map< const LibDependency *, DependencyState > dependencies_
Definition code_snippet_factory.h:80
const std::filesystem::path output_path_
Definition code_snippet_factory.h:72
const std::filesystem::path & header_path() const
Definition code_snippet_factory.h:99
const std::unordered_map< std::string, CodeSnippet > & snippets() const
std::unordered_map< std::string, CodeSnippet > snippets_
Definition code_snippet_factory.h:71
bool require_dependency(const LibDependency *dependency)
Ensure that the given dependency is available or throw.
std::unordered_set< std::string > teardown_snippets_
Definition code_snippet_factory.h:76
virtual const std::unordered_set< std::string > & setup_snippets() const
const std::filesystem::path & output_path() const
Definition code_snippet_factory.h:96
virtual void add_setup(const std::string &snippet)
std::unordered_map< std::string, CodeSnippet >::iterator find(const std::string &name)
std::unordered_map< std::string, const LibDependency * > conflicting_ids_
Definition code_snippet_factory.h:79
CodeSnippet & require(const std::string &name, const std::string &extension)
Definition code_snippet_factory.h:88
virtual CodeSnippet & require(const std::string &name, const std::string &extension, bool as_file)
bool is_available(const LibDependency *dependency) const
The dependency is either already required or the system knows it is available.
virtual void add_global(const std::string &snippet)
Definition code_snippet_factory.h:15
const std::string & name() const
Definition code_snippet_factory.h:42
bool as_file_
Definition code_snippet_factory.h:19
std::string extension_
Definition code_snippet_factory.h:18
PrettyPrinter & stream()
Definition code_snippet_factory.h:26
std::filesystem::path filename() const
Definition code_snippet_factory.h:46
const PrettyPrinter & stream() const
Definition code_snippet_factory.h:30
PrettyPrinter stream_
Definition code_snippet_factory.h:17
const std::string & extension() const
Definition code_snippet_factory.h:34
CodeSnippet(const std::string &name, const std::string &extension, bool as_file)
Definition code_snippet_factory.h:23
bool is_as_file() const
Definition code_snippet_factory.h:38
std::string name_
Definition code_snippet_factory.h:20
Definition code_snippet_factory.h:51
virtual void enumerate_includes(std::vector< std::string > &out_list) const =0
virtual std::string_view name() const =0
virtual std::vector< std::string_view > & globally_unique_ids() const =0
virtual ~LibDependency()=default
const std::unordered_set< std::string > & teardown_snippets() const override
Definition code_snippet_factory.h:170
void add_teardown(const std::string &snippet) override
Definition code_snippet_factory.h:161
void add_setup(const std::string &snippet) override
Definition code_snippet_factory.h:158
NestedCodeSnippetFactory(const std::pair< std::filesystem::path, std::filesystem::path > *config=nullptr)
CodeSnippet & require(const std::string &name, const std::string &extension, bool as_file) override
Definition code_snippet_factory.h:154
void add_global(const std::string &snippet) override
Definition code_snippet_factory.h:164
const std::unordered_set< std::string > & setup_snippets() const override
Definition code_snippet_factory.h:167
Definition utils.h:16
Definition argument_registry.h:10
std::string CODE_SNIPPET_DEINIT_ONCE
Definition code_snippet_factory.h:13
std::string CODE_SNIPPET_INIT_ONCE
Definition code_snippet_factory.h:12
Definition analysis.h:7
Definition code_snippet_factory.h:59
bool used
Definition code_snippet_factory.h:60
bool runtime_available
Definition code_snippet_factory.h:61