#include #include "FileReader.h" #include "FileStrategy.h" using namespace std; unique_ptr FileReader::open(const std::string url) { FileStrategy * reader = find_reader(url)->clone(); reader->open(url); return unique_ptr(reader); } void FileReader::register_strategy(const std::string type, const FileStrategy * node) { static FactoryMap & map = get_map(); map[type] = node; } FactoryMap & FileReader::get_map() { static FactoryMap map; return map; } const FileStrategy * FileReader::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; }