#include <iostream>
#include <map>
#include <functional>
using namespace std;
enum MessageType { MSG_NONE = -1, MSG_TYPE_START_PROCESS, MSG_TYPE_END_PROCESS };
typedef std::map<MessageType, std::function<void()>> MessageFuncMap;
void startProcess()
{
cout << "start process" << endl;
}
void endProcess()
{
cout << "end process" << endl;
}
void defaultOutput(MessageType msgType)
{
cout << "unknown message type: " << (int)msgType << endl;
}
void callFunc(MessageFuncMap msgFunc, MessageType msgType, std::function<void(MessageType)> defaultFunc = nullptr)
{
auto it = msgFunc.find(msgType);
if (it != msgFunc.end())
(it->second)();
else
if (defaultFunc != nullptr)
defaultFunc(msgType);
}
void callMessageFunc(MessageFuncMap msgFunc, MessageType msgType)
{
callFunc(msgFunc, msgType, defaultOutput);
}
int main() {
MessageFuncMap msgFunc;
msgFunc[MSG_TYPE_START_PROCESS] = startProcess;
msgFunc[MSG_TYPE_END_PROCESS] = endProcess;
callMessageFunc(msgFunc, MSG_TYPE_START_PROCESS);
callMessageFunc(msgFunc, MSG_TYPE_END_PROCESS);
callMessageFunc(msgFunc, MSG_NONE);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmVudW0gTWVzc2FnZVR5cGUgeyBNU0dfTk9ORSA9IC0xLCBNU0dfVFlQRV9TVEFSVF9QUk9DRVNTLCBNU0dfVFlQRV9FTkRfUFJPQ0VTUyB9OwoKdHlwZWRlZiBzdGQ6Om1hcDxNZXNzYWdlVHlwZSwgc3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBNZXNzYWdlRnVuY01hcDsKCnZvaWQgc3RhcnRQcm9jZXNzKCkKewoJY291dCA8PCAic3RhcnQgcHJvY2VzcyIgPDwgZW5kbDsKfQoKdm9pZCBlbmRQcm9jZXNzKCkKewoJY291dCA8PCAiZW5kIHByb2Nlc3MiIDw8IGVuZGw7Cn0KCnZvaWQgZGVmYXVsdE91dHB1dChNZXNzYWdlVHlwZSBtc2dUeXBlKQp7Cgljb3V0IDw8ICJ1bmtub3duIG1lc3NhZ2UgdHlwZTogIiA8PCAoaW50KW1zZ1R5cGUgPDwgZW5kbDsKfQoKdm9pZCBjYWxsRnVuYyhNZXNzYWdlRnVuY01hcCBtc2dGdW5jLCBNZXNzYWdlVHlwZSBtc2dUeXBlLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoTWVzc2FnZVR5cGUpPiBkZWZhdWx0RnVuYyA9IG51bGxwdHIpCnsKCWF1dG8gaXQgPSBtc2dGdW5jLmZpbmQobXNnVHlwZSk7CglpZiAoaXQgIT0gbXNnRnVuYy5lbmQoKSkKCQkoaXQtPnNlY29uZCkoKTsKCWVsc2UKCSAgaWYgKGRlZmF1bHRGdW5jICE9IG51bGxwdHIpCgkgICAgZGVmYXVsdEZ1bmMobXNnVHlwZSk7Cn0KCnZvaWQgY2FsbE1lc3NhZ2VGdW5jKE1lc3NhZ2VGdW5jTWFwIG1zZ0Z1bmMsIE1lc3NhZ2VUeXBlIG1zZ1R5cGUpCnsKCWNhbGxGdW5jKG1zZ0Z1bmMsIG1zZ1R5cGUsIGRlZmF1bHRPdXRwdXQpOwp9CgppbnQgbWFpbigpIHsKTWVzc2FnZUZ1bmNNYXAgbXNnRnVuYzsKCm1zZ0Z1bmNbTVNHX1RZUEVfU1RBUlRfUFJPQ0VTU10gPSBzdGFydFByb2Nlc3M7Cm1zZ0Z1bmNbTVNHX1RZUEVfRU5EX1BST0NFU1NdID0gZW5kUHJvY2VzczsKCmNhbGxNZXNzYWdlRnVuYyhtc2dGdW5jLCBNU0dfVFlQRV9TVEFSVF9QUk9DRVNTKTsKY2FsbE1lc3NhZ2VGdW5jKG1zZ0Z1bmMsIE1TR19UWVBFX0VORF9QUk9DRVNTKTsKY2FsbE1lc3NhZ2VGdW5jKG1zZ0Z1bmMsIE1TR19OT05FKTsKCglyZXR1cm4gMDsKfQo=