diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-10-18 15:48:14 +0200 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-10-18 15:48:14 +0200 |
commit | d8289105193707daede1a5b59137f18e20f20aeb (patch) | |
tree | 939908b9c4c6f7aaef8aa61ee2e04be3e85610b6 /FileReaderFactory.cpp | |
parent | 76e61d68bbf568ec0d7fc4632e52d4de5496b003 (diff) |
(2/2) rename
Diffstat (limited to 'FileReaderFactory.cpp')
-rw-r--r-- | FileReaderFactory.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/FileReaderFactory.cpp b/FileReaderFactory.cpp new file mode 100644 index 0000000..4b72b11 --- /dev/null +++ b/FileReaderFactory.cpp @@ -0,0 +1,36 @@ +#include <memory> + +#include "FileReaderFactory.h" +#include "FileReader.h" + +using namespace std; + +unique_ptr<FileReader> FileReaderFactory::open(const std::string url) { + FileReader * reader = find_reader(url)->clone(); + reader->open(url); + return unique_ptr<FileReader>(reader); +} + +void FileReaderFactory::register_strategy(const std::string type, const FileReader * node) { + static FactoryMap & map = get_map(); + map[type] = node; +} + +FactoryMap & FileReaderFactory::get_map() { + static FactoryMap map; + return map; +} + +const FileReader * FileReaderFactory::find_reader(const std::string type) { + static FactoryMap & map = get_map(); + + // try to find protocol by prefix + for (auto item : map) { + if (!type.starts_with(item.first)) continue; + return item.second; + } + + // fallback is local file + return map.find("file://")->second; +} + |