#include <iostream>
#include <functional>
#include <vector>
using namespace std;
using word = unsigned;
const word DD_MASK=100;
struct Cpu {
void Clr(word x) { std::cout<<"Clr "<<x<<endl; };
void Com(word x) { std::cout<<"Com "<<x<<endl; };
};
using InstrFunc = void (Cpu::*)(word);
//using InstrFunc = std::function<void(Cpu*, word)>;
struct InstructionDescription
{
std::string name;
word mask;
word code;
InstrFunc func;
word flags;
};
int main() {
vector<InstructionDescription> instructions {
{"clr", DD_MASK, 0005000, &Cpu::Clr},
{"clrb", DD_MASK, 0105000, &Cpu::Clr},
{"com", DD_MASK, 0005100, &Cpu::Com}
};
Cpu cpu;
for (auto& i:instructions) {
// i.func(&cpu, i.code); // as simple as that with std::function
(cpu.*i.func)(i.code);
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4gCiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyB3b3JkID0gdW5zaWduZWQ7ICAKY29uc3Qgd29yZCBERF9NQVNLPTEwMDsgCnN0cnVjdCBDcHUgewoJdm9pZCBDbHIod29yZCB4KSB7IHN0ZDo6Y291dDw8IkNsciAiPDx4PDxlbmRsOyB9OyAKCXZvaWQgQ29tKHdvcmQgeCkgeyBzdGQ6OmNvdXQ8PCJDb20gIjw8eDw8ZW5kbDsgfTsgCn07IAoKdXNpbmcgSW5zdHJGdW5jID0gdm9pZCAoQ3B1OjoqKSh3b3JkKTsKLy91c2luZyBJbnN0ckZ1bmMgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQ3B1Kiwgd29yZCk+OyAKc3RydWN0IEluc3RydWN0aW9uRGVzY3JpcHRpb24KewogICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgIHdvcmQgbWFzazsKICAgIHdvcmQgY29kZTsKICAgIEluc3RyRnVuYyBmdW5jOwogICAgd29yZCBmbGFnczsKfTsKCgppbnQgbWFpbigpIHsKICB2ZWN0b3I8SW5zdHJ1Y3Rpb25EZXNjcmlwdGlvbj4gaW5zdHJ1Y3Rpb25zIHsKICAgIHsiY2xyIiwgICAgIEREX01BU0ssICAgICAgICAwMDA1MDAwLCAgICAmQ3B1OjpDbHJ9LAogICAgeyJjbHJiIiwgICAgRERfTUFTSywgICAgICAgIDAxMDUwMDAsICAgICZDcHU6OkNscn0sCiAgICB7ImNvbSIsICAgICBERF9NQVNLLCAgICAgICAgMDAwNTEwMCwgICAgJkNwdTo6Q29tfQogIH07CQogIENwdSBjcHU7ICAKICBmb3IgKGF1dG8mIGk6aW5zdHJ1Y3Rpb25zKSB7Ci8vICAgICAgaS5mdW5jKCZjcHUsIGkuY29kZSk7ICAgLy8gYXMgc2ltcGxlIGFzIHRoYXQgd2l0aCBzdGQ6OmZ1bmN0aW9uCiAgICAgIChjcHUuKmkuZnVuYykoaS5jb2RlKTsKICB9Cn0=