10 #include <unordered_map>
14 namespace gate_library_writer_manager
18 std::unordered_map<std::string, std::vector<std::string>> m_writer_to_extensions;
19 std::unordered_map<std::string, std::pair<std::string, WriterFactory>> m_extension_to_writer;
21 WriterFactory get_writer_factory_for_file(
const std::filesystem::path& file_name)
23 std::string extension =
utils::to_lower(file_name.extension().string());
24 if (!extension.empty() && extension[0] !=
'.')
26 extension =
"." + extension;
29 if (
auto it = m_extension_to_writer.find(extension); it != m_extension_to_writer.end())
31 log_info(
"gate_library_writer",
"selected gate library writer '{}'.", it->second.first);
32 return it->second.second;
35 log_error(
"gate_library_writer",
"no gate library writer registered for file extension '{}'.", extension);
42 for (std::string ext : supported_file_extensions)
45 if (!ext.empty() && ext[0] !=
'.')
49 if (
auto it = m_extension_to_writer.find(ext); it != m_extension_to_writer.end())
51 log_warning(
"gate_library_writer",
"writer '{}' cannot be registered as file extension '{}' is already associated with writer '{}'.",
name, ext, it->second.first);
54 m_extension_to_writer.emplace(ext, std::make_pair(
name, writer_factory));
55 m_writer_to_extensions[
name].push_back(ext);
57 log_info(
"gate_library_writer",
"registered gate library writer '{}' for file extension '{}'.",
name, ext);
63 if (
auto it = m_writer_to_extensions.find(
name); it != m_writer_to_extensions.end())
65 for (
const auto& ext : it->second)
67 if (
auto rm_it = m_extension_to_writer.find(ext); rm_it != m_extension_to_writer.end())
69 m_extension_to_writer.erase(rm_it);
70 log_info(
"gate_library_writer",
"unregistered gate library writer '{}' for file extension '{}'.",
name, ext);
73 m_writer_to_extensions.erase(it);
79 auto factory = get_writer_factory_for_file(file_path);
85 std::unique_ptr<GateLibraryWriter> writer = factory();
87 log_info(
"gate_library_writer",
"writing gate library '{}' to file '{}'...", gate_lib->
get_name(), file_path.string());
89 auto begin_time = std::chrono::high_resolution_clock::now();
90 if (!writer->write(gate_lib, file_path))
92 log_error(
"gate_library_writer",
"failed to write gate library '{}' to file '{}'.", gate_lib->
get_name(), file_path.string());
97 "wrote gate library '{}' to file '{}' in {:2.2f} seconds.",
100 (
double)std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - begin_time).count() / 1000);
std::string get_name() const
#define log_error(channel,...)
#define log_info(channel,...)
#define log_warning(channel,...)
void unregister_writer(const std::string &name)
std::function< std::unique_ptr< GateLibraryWriter >()> WriterFactory
void register_writer(const std::string &name, const WriterFactory &writer_factory, const std::vector< std::string > &supported_file_extensions)
bool write(const GateLibrary *gate_lib, const std::filesystem::path &file_path)
CORE_API T trim(const T &s, const char *to_remove=" \t\r\n")
CORE_API T to_lower(const T &s)