HAL
gate_library_parser_manager.cpp
Go to the documentation of this file.
2 
8 
9 #include <regex>
10 #include <sstream>
11 
12 namespace hal
13 {
14  namespace gate_library_parser_manager
15  {
16  namespace
17  {
18  std::unordered_map<std::string, std::vector<std::string>> m_parser_to_extensions;
19  std::unordered_map<std::string, std::pair<std::string, ParserFactory>> m_extension_to_parser;
20 
21  ParserFactory get_parser_factory_for_file(const std::filesystem::path& file_name)
22  {
23  auto extension = utils::to_lower(file_name.extension().string());
24  if (!extension.empty() && extension[0] != '.')
25  {
26  extension = "." + extension;
27  }
28 
29  if (auto it = m_extension_to_parser.find(extension); it != m_extension_to_parser.end())
30  {
31  log_info("gate_library_parser", "selected gate library parser '{}'.", it->second.first);
32  return it->second.second;
33  }
34 
35  log_error("gate_library_parser", "no gate library parser registered for file extension '{}'.", extension);
36  return ParserFactory();
37  }
38  } // namespace
39 
40  void register_parser(const std::string& name, const ParserFactory& parser_factory, const std::vector<std::string>& supported_file_extensions)
41  {
42  for (auto ext : supported_file_extensions)
43  {
44  ext = utils::trim(utils::to_lower(ext));
45  if (!ext.empty() && ext[0] != '.')
46  {
47  ext = "." + ext;
48  }
49  if (auto it = m_extension_to_parser.find(ext); it != m_extension_to_parser.end())
50  {
51  log_warning("gate_library_parser", "file extension '{}' is already associated with parser '{}'.", ext, it->second.first);
52  continue;
53  }
54  m_extension_to_parser.emplace(ext, std::make_pair(name, parser_factory));
55  m_parser_to_extensions[name].push_back(ext);
56 
57  log_info("gate_library_parser", "registered gate library parser '{}' for file extension '{}'.", name, ext);
58  }
59  }
60 
61  void unregister_parser(const std::string& name)
62  {
63  if (auto it = m_parser_to_extensions.find(name); it != m_parser_to_extensions.end())
64  {
65  for (const auto& ext : it->second)
66  {
67  if (auto rm_it = m_extension_to_parser.find(ext); rm_it != m_extension_to_parser.end())
68  {
69  m_extension_to_parser.erase(rm_it);
70  log_info("gate_library_parser", "unregistered gate library parser '{}' for file extension '{}'.", name, ext);
71  }
72  }
73  m_parser_to_extensions.erase(it);
74  }
75  }
76 
77  std::unique_ptr<GateLibrary> parse(std::filesystem::path file_path)
78  {
79  auto factory = get_parser_factory_for_file(file_path);
80  if (!factory)
81  {
82  return nullptr;
83  }
84 
85  auto parser = factory();
86 
87  auto begin_time = std::chrono::high_resolution_clock::now();
88 
89  if (auto res = parser->parse(file_path); res.is_error())
90  {
91  log_error("gate_library_parser", "error encountered while parsing gate library from file '{}':\n{}", file_path.string(), res.get_error().get());
92  return nullptr;
93  }
94  else
95  {
96  std::unique_ptr<GateLibrary> gate_lib = res.get();
97  log_info("gate_library_parser",
98  "parsed gate library '{}' from file '{}' in {:2.2f} seconds.",
99  gate_lib->get_name(),
100  file_path.string(),
101  (double)std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - begin_time).count() / 1000);
102  return gate_lib;
103  }
104  }
105  } // namespace gate_library_parser_manager
106 } // namespace hal
#define log_error(channel,...)
Definition: log.h:78
#define log_info(channel,...)
Definition: log.h:70
#define log_warning(channel,...)
Definition: log.h:76
parser
Definition: control.py:13
std::unique_ptr< GateLibrary > parse(std::filesystem::path file_path)
void unregister_parser(const std::string &name)
void register_parser(const std::string &name, const ParserFactory &parser_factory, const std::vector< std::string > &supported_file_extensions)
std::function< std::unique_ptr< GateLibraryParser >()> ParserFactory
CORE_API T trim(const T &s, const char *to_remove=" \t\r\n")
Definition: utils.h:358
CORE_API T to_lower(const T &s)
Definition: utils.h:477
std::string name