#include <iostream>
#include <map>
#include <functional>
#include <algorithm>
using namespace std;
void smithJonesAnalysis (int data){cout << "Smith";}
void pineappleMangoAnalysis (int data){cout << "Pineapple";}
class Analyzer
{
enum class AnalysisMethod {SmithJones, PineappleMango};
std::map<AnalysisMethod, std::function<void(int)>> m_analysis_map;
AnalysisMethod stringToMethod (std::string method)
{
std::transform(method.begin(), method.end(), method.begin(), ::tolower);
if (method == "smith-jones method")
return AnalysisMethod::SmithJones;
if (method == "pineapple-mango method")
return AnalysisMethod::PineappleMango;
throw std::runtime_error("Invalid analysis method");
}
public:
Analyzer()
{
m_analysis_map[AnalysisMethod::SmithJones] = smithJonesAnalysis;
m_analysis_map[AnalysisMethod::PineappleMango] = pineappleMangoAnalysis;
}
void operator() (std::string method, int data)
{
AnalysisMethod am = stringToMethod(method);
m_analysis_map[am](data);
}
private:
};
int main() {
Analyzer a;
a("Smith-Jones Method", 0);
a("Pineapple-Mango Method", 0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgc21pdGhKb25lc0FuYWx5c2lzIChpbnQgZGF0YSl7Y291dCA8PCAiU21pdGgiO30Kdm9pZCBwaW5lYXBwbGVNYW5nb0FuYWx5c2lzIChpbnQgZGF0YSl7Y291dCA8PCAiUGluZWFwcGxlIjt9CgpjbGFzcyBBbmFseXplcgp7CgllbnVtIGNsYXNzIEFuYWx5c2lzTWV0aG9kIHtTbWl0aEpvbmVzLCBQaW5lYXBwbGVNYW5nb307CglzdGQ6Om1hcDxBbmFseXNpc01ldGhvZCwgc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+PiBtX2FuYWx5c2lzX21hcDsKCQkKCUFuYWx5c2lzTWV0aG9kIHN0cmluZ1RvTWV0aG9kIChzdGQ6OnN0cmluZyBtZXRob2QpCgl7CgkJc3RkOjp0cmFuc2Zvcm0obWV0aG9kLmJlZ2luKCksIG1ldGhvZC5lbmQoKSwgbWV0aG9kLmJlZ2luKCksIDo6dG9sb3dlcik7CgkJaWYgKG1ldGhvZCA9PSAic21pdGgtam9uZXMgbWV0aG9kIikKCQkgICAgcmV0dXJuIEFuYWx5c2lzTWV0aG9kOjpTbWl0aEpvbmVzOwoJCWlmIChtZXRob2QgPT0gInBpbmVhcHBsZS1tYW5nbyBtZXRob2QiKQoJCSAgICByZXR1cm4gQW5hbHlzaXNNZXRob2Q6OlBpbmVhcHBsZU1hbmdvOwoJICAgIAoJCXRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiSW52YWxpZCBhbmFseXNpcyBtZXRob2QiKTsKCX0KcHVibGljOgoJQW5hbHl6ZXIoKQoJewoJCW1fYW5hbHlzaXNfbWFwW0FuYWx5c2lzTWV0aG9kOjpTbWl0aEpvbmVzXSA9IHNtaXRoSm9uZXNBbmFseXNpczsKCQltX2FuYWx5c2lzX21hcFtBbmFseXNpc01ldGhvZDo6UGluZWFwcGxlTWFuZ29dID0gcGluZWFwcGxlTWFuZ29BbmFseXNpczsKCX0KCXZvaWQgb3BlcmF0b3IoKSAoc3RkOjpzdHJpbmcgbWV0aG9kLCBpbnQgZGF0YSkKCXsKCQlBbmFseXNpc01ldGhvZCBhbSA9IHN0cmluZ1RvTWV0aG9kKG1ldGhvZCk7CgkJbV9hbmFseXNpc19tYXBbYW1dKGRhdGEpOwoJfQoKcHJpdmF0ZToKCQoKCn07CgppbnQgbWFpbigpIHsKCUFuYWx5emVyIGE7CglhKCJTbWl0aC1Kb25lcyBNZXRob2QiLCAwKTsKCWEoIlBpbmVhcHBsZS1NYW5nbyBNZXRob2QiLCAwKTsKCXJldHVybiAwOwp9