41 static const std::unordered_set<std::string> rst_keep_in_solution;
42 static const std::unordered_set<std::string> rst_keep_in_schedule;
44enum class OutputMode {
53 std::size_t file_index;
54 std::size_t keyword_index;
56 Index(std::size_t file_index_arg, std::size_t keyword_index_arg,
const FileDeck* deck_arg)
57 : file_index(file_index_arg)
58 , keyword_index(keyword_index_arg)
63 Index operator--(
int);
65 Index operator++(
int);
66 bool operator==(
const Index& other)
const;
67 bool operator!=(
const Index& other)
const;
68 bool operator<(
const Index& other)
const;
69 Index operator+(std::size_t shift)
const;
79 explicit Block(
const std::string& filename);
80 std::size_t size()
const;
81 void load(
const Deck& deck, std::size_t deck_index);
82 std::optional<std::size_t> find(
const std::string& keyword, std::size_t keyword_index)
const;
85 void insert(std::size_t keyword_index,
const DeckKeyword& keyword);
90 std::vector<DeckKeyword> keywords;
97 std::optional<Index> find(
const std::string& keyword,
const Index& offset)
const;
98 std::optional<Index> find(
const std::string& keyword)
const;
99 std::size_t count(
const std::string& keyword)
const;
100 void erase(
const Index& index);
101 void erase(
const Index& begin,
const Index& end);
104 void dump_stdout(
const std::string& output_dir, OutputMode mode)
const;
105 void dump(
const std::string& dir,
const std::string& fname, OutputMode mode)
const;
107 const Index start()
const;
108 const Index stop()
const;
110 void rst_solution(
const std::string& rst_base,
int report_step);
111 void insert_skiprest();
112 void skip(
int report_step);
115 std::vector<Block> blocks;
116 std::string input_directory;
117 std::unordered_set<std::string> modified_files;
121 std::unordered_map<std::string, std::ofstream> stream_map;
122 std::unordered_map<std::string, std::string> file_map;
124 bool has_file(
const std::string& fname)
const {
125 return this->file_map.count(fname) > 0;
128 std::optional<std::ofstream *> get_stream(
const std::string& deck_name) {
129 auto name_iter = this->file_map.find(deck_name);
130 if (name_iter == this->file_map.end())
133 return &this->stream_map.at(name_iter->second);
137 std::ofstream& open_file(
const std::string& deck_name,
const fs::path& output_file)
139 if (this->stream_map.count(output_file.string()) == 0) {
140 this->file_map.insert(std::make_pair( deck_name, output_file.string() ));
142 if (!fs::is_directory(output_file.parent_path()))
143 fs::create_directories(output_file.parent_path());
145 std::ofstream stream{output_file};
147 throw std::logic_error(fmt::format(
"Opening {} for writing failed", output_file.string()));
148 this->stream_map.insert(std::make_pair(output_file.string(), std::move(stream)));
150 return this->stream_map.at(output_file.string());
155 void dump(std::ostream& os)
const;
156 void dump_shared(std::ostream& stream,
const std::string& output_dir)
const;
157 void dump_inline()
const;
158 std::string dump_block(
const Block& block,
const std::string& dir,
const std::optional<std::string>& fname, DumpContext& context)
const;
159 void include_block(
const std::string& source_file,
const std::string& target_file,
const std::string& dir, DumpContext& context)
const;
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30