#include <iostream>
#include <ctime>
#include <map>
class Controller
{
public:
int function1(int a, int b) {return a + b;}
int function2(int a, int b) {return a + b;}
int function3(int a, int b) {return a * b;}
int function4(int a, int b) {return a + 50 + b/2;}
int function5(int a, int b) {return a + b;}
int function6(int a, int b) {return a / 2 + b;}
int function7(int a, int b) {return a + b * 19;}
int function8(int a, int b) {return a + b * 20;}
int function9(int a, int b) {return a + b + 100;}
int function10(int a, int b) {return a / b;}
};
typedef int (Controller::*function)(int a, int b);
class Dispatcher
{
public:
Dispatcher()
{
m_functionsTable.insert(std::pair<std::string, function>("function1", &Controller::function1));
m_functionsTable.insert(std::pair<std::string, function>("function2", &Controller::function2));
m_functionsTable.insert(std::pair<std::string, function>("function3", &Controller::function3));
m_functionsTable.insert(std::pair<std::string, function>("function4", &Controller::function4));
m_functionsTable.insert(std::pair<std::string, function>("function5", &Controller::function5));
m_functionsTable.insert(std::pair<std::string, function>("function6", &Controller::function6));
m_functionsTable.insert(std::pair<std::string, function>("function7", &Controller::function7));
m_functionsTable.insert(std::pair<std::string, function>("function8", &Controller::function8));
m_functionsTable.insert(std::pair<std::string, function>("function9", &Controller::function9));
m_functionsTable.insert(std::pair<std::string, function>("function10", &Controller::function10));
}
int FunctionDispatcher(std::string functionName, int a, int b) {
Controller c;
function f = m_functionsTable.find(functionName)->second;
return (c.*(function)f)(a, b);
}
private:
std::map<std::string, function> m_functionsTable;
};
int main()
{
time_t t1 = time(NULL);
Dispatcher d;
for (int i = 0; i < 100000000; i ++) {
d.FunctionDispatcher("function1", i, i + 1);
d.FunctionDispatcher("function2", i, i + 1);
d.FunctionDispatcher("function3", i, i + 1);
d.FunctionDispatcher("function4", i, i + 1);
d.FunctionDispatcher("function5", i, i + 1);
d.FunctionDispatcher("function6", i, i + 1);
d.FunctionDispatcher("function7", i, i + 1);
d.FunctionDispatcher("function8", i, i + 1);
d.FunctionDispatcher("function9", i, i + 1);
d.FunctionDispatcher("function10", i, i + 1);
}
time_t t2 = time(NULL);
std::cout << t2 - t1 << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxtYXA+CgpjbGFzcyBDb250cm9sbGVyCnsKcHVibGljOgogICAgICAgIGludCBmdW5jdGlvbjEoaW50IGEsIGludCBiKSB7cmV0dXJuIGEgKyBiO30KICAgICAgICBpbnQgZnVuY3Rpb24yKGludCBhLCBpbnQgYikge3JldHVybiBhICsgYjt9CiAgICAgICAgaW50IGZ1bmN0aW9uMyhpbnQgYSwgaW50IGIpIHtyZXR1cm4gYSAqIGI7fQogICAgICAgIGludCBmdW5jdGlvbjQoaW50IGEsIGludCBiKSB7cmV0dXJuIGEgKyA1MCArIGIvMjt9CiAgICAgICAgaW50IGZ1bmN0aW9uNShpbnQgYSwgaW50IGIpIHtyZXR1cm4gYSArIGI7fQogICAgICAgIGludCBmdW5jdGlvbjYoaW50IGEsIGludCBiKSB7cmV0dXJuIGEgLyAyICsgYjt9CiAgICAgICAgaW50IGZ1bmN0aW9uNyhpbnQgYSwgaW50IGIpIHtyZXR1cm4gYSArIGIgKiAxOTt9CiAgICAgICAgaW50IGZ1bmN0aW9uOChpbnQgYSwgaW50IGIpIHtyZXR1cm4gYSArIGIgKiAyMDt9CiAgICAgICAgaW50IGZ1bmN0aW9uOShpbnQgYSwgaW50IGIpIHtyZXR1cm4gYSArIGIgKyAxMDA7fQogICAgICAgIGludCBmdW5jdGlvbjEwKGludCBhLCBpbnQgYikge3JldHVybiBhIC8gYjt9Cn07Cgp0eXBlZGVmIGludCAoQ29udHJvbGxlcjo6KmZ1bmN0aW9uKShpbnQgYSwgaW50IGIpOwoKY2xhc3MgRGlzcGF0Y2hlcgp7CnB1YmxpYzoKICAgICAgICBEaXNwYXRjaGVyKCkKICAgICAgICB7CiAgICAgICAgICAgICAgICBtX2Z1bmN0aW9uc1RhYmxlLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGZ1bmN0aW9uPigiZnVuY3Rpb24xIiwgJkNvbnRyb2xsZXI6OmZ1bmN0aW9uMSkpOwogICAgICAgICAgICAgICAgbV9mdW5jdGlvbnNUYWJsZS5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBmdW5jdGlvbj4oImZ1bmN0aW9uMiIsICZDb250cm9sbGVyOjpmdW5jdGlvbjIpKTsKICAgICAgICAgICAgICAgIG1fZnVuY3Rpb25zVGFibGUuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgZnVuY3Rpb24+KCJmdW5jdGlvbjMiLCAmQ29udHJvbGxlcjo6ZnVuY3Rpb24zKSk7CiAgICAgICAgICAgICAgICBtX2Z1bmN0aW9uc1RhYmxlLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGZ1bmN0aW9uPigiZnVuY3Rpb240IiwgJkNvbnRyb2xsZXI6OmZ1bmN0aW9uNCkpOwogICAgICAgICAgICAgICAgbV9mdW5jdGlvbnNUYWJsZS5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBmdW5jdGlvbj4oImZ1bmN0aW9uNSIsICZDb250cm9sbGVyOjpmdW5jdGlvbjUpKTsKICAgICAgICAgICAgICAgIG1fZnVuY3Rpb25zVGFibGUuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgZnVuY3Rpb24+KCJmdW5jdGlvbjYiLCAmQ29udHJvbGxlcjo6ZnVuY3Rpb242KSk7CiAgICAgICAgICAgICAgICBtX2Z1bmN0aW9uc1RhYmxlLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGZ1bmN0aW9uPigiZnVuY3Rpb243IiwgJkNvbnRyb2xsZXI6OmZ1bmN0aW9uNykpOwogICAgICAgICAgICAgICAgbV9mdW5jdGlvbnNUYWJsZS5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBmdW5jdGlvbj4oImZ1bmN0aW9uOCIsICZDb250cm9sbGVyOjpmdW5jdGlvbjgpKTsKICAgICAgICAgICAgICAgIG1fZnVuY3Rpb25zVGFibGUuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgZnVuY3Rpb24+KCJmdW5jdGlvbjkiLCAmQ29udHJvbGxlcjo6ZnVuY3Rpb245KSk7CiAgICAgICAgICAgICAgICBtX2Z1bmN0aW9uc1RhYmxlLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGZ1bmN0aW9uPigiZnVuY3Rpb24xMCIsICZDb250cm9sbGVyOjpmdW5jdGlvbjEwKSk7CiAgICAgICAgfQogICAgICAgIGludCBGdW5jdGlvbkRpc3BhdGNoZXIoc3RkOjpzdHJpbmcgZnVuY3Rpb25OYW1lLCBpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgIENvbnRyb2xsZXIgYzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYgPSBtX2Z1bmN0aW9uc1RhYmxlLmZpbmQoZnVuY3Rpb25OYW1lKS0+c2Vjb25kOwogICAgICAgICAgICAgICAgcmV0dXJuIChjLiooZnVuY3Rpb24pZikoYSwgYik7CiAgICAgICAgfQpwcml2YXRlOgogICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBmdW5jdGlvbj4gbV9mdW5jdGlvbnNUYWJsZTsKfTsKCgppbnQgbWFpbigpCnsKCiAgICAgICAgdGltZV90IHQxID0gdGltZShOVUxMKTsKCiAgICAgICAgRGlzcGF0Y2hlciBkOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDAwMDAwOyBpICsrKSB7CiAgICAgICAgICAgICAgICBkLkZ1bmN0aW9uRGlzcGF0Y2hlcigiZnVuY3Rpb24xIiwgaSwgaSArIDEpOwogICAgICAgICAgICAgICAgZC5GdW5jdGlvbkRpc3BhdGNoZXIoImZ1bmN0aW9uMiIsIGksIGkgKyAxKTsKICAgICAgICAgICAgICAgIGQuRnVuY3Rpb25EaXNwYXRjaGVyKCJmdW5jdGlvbjMiLCBpLCBpICsgMSk7CiAgICAgICAgICAgICAgICBkLkZ1bmN0aW9uRGlzcGF0Y2hlcigiZnVuY3Rpb240IiwgaSwgaSArIDEpOwogICAgICAgICAgICAgICAgZC5GdW5jdGlvbkRpc3BhdGNoZXIoImZ1bmN0aW9uNSIsIGksIGkgKyAxKTsKICAgICAgICAgICAgICAgIGQuRnVuY3Rpb25EaXNwYXRjaGVyKCJmdW5jdGlvbjYiLCBpLCBpICsgMSk7CiAgICAgICAgICAgICAgICBkLkZ1bmN0aW9uRGlzcGF0Y2hlcigiZnVuY3Rpb243IiwgaSwgaSArIDEpOwogICAgICAgICAgICAgICAgZC5GdW5jdGlvbkRpc3BhdGNoZXIoImZ1bmN0aW9uOCIsIGksIGkgKyAxKTsKICAgICAgICAgICAgICAgIGQuRnVuY3Rpb25EaXNwYXRjaGVyKCJmdW5jdGlvbjkiLCBpLCBpICsgMSk7CiAgICAgICAgICAgICAgICBkLkZ1bmN0aW9uRGlzcGF0Y2hlcigiZnVuY3Rpb24xMCIsIGksIGkgKyAxKTsKCiAgICAgICAgfQoKICAgICAgICB0aW1lX3QgdDIgPSB0aW1lKE5VTEwpOwogICAgICAgIHN0ZDo6Y291dCA8PCB0MiAtIHQxIDw8IHN0ZDo6ZW5kbDsKfQo=