#include #include "FileReaderFactory.h" #include "FileReader.h" using namespace std; unique_ptr FileReaderFactory::open(const std::string url) { FileReader * reader = find_reader(url)->clone(); reader->open(url); return unique_ptr(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; }