#include <iostream>
using namespace std;
class Machine
{
class State *current;
class State *nextstate;
void check_transition();
public:
Machine();
void setCurrent(State *s)
{
nextstate = s;
//current = s;
}
void set_on();
void set_off();
};
class State
{
public:
virtual void set_on(Machine *m)
{
cout << " already ON\n";
}
virtual void set_off(Machine *m)
{
cout << " already OFF\n";
}
virtual ~State(){}
};
void Machine::check_transition() {
if (nextstate) {
swap (current, nextstate);
delete nextstate; // this contains the former current
nextstate = nullptr;
}
}
void Machine::set_on()
{
current->set_on(this);
check_transition();
}
void Machine::set_off()
{
current->set_off(this);
check_transition();
}
class ON: public State
{
public:
ON()
{
cout << " ON-ctor ";
};
~ON()
{
cout << " dtor-ON\n";
};
void set_off(Machine *m);
};
class OFF: public State
{
public:
OFF()
{
cout << " OFF-ctor ";
};
~OFF()
{
cout << " dtor-OFF\n";
};
void set_on(Machine *m)
{
cout << " going from OFF to ON";
m->setCurrent(new ON());
}
};
void ON::set_off(Machine *m)
{
cout << " going from ON to OFF";
m->setCurrent(new OFF());
}
Machine::Machine()
{
nextstate = nullptr;
current = new OFF();
cout << '\n';
}
int main()
{
void(Machine:: *ptrs[])() =
{
&Machine::set_off, &Machine::set_on
};
Machine fsm;
int num;
cout << "Enter 0/1: ";
while (cin >> num)
{
(fsm.*ptrs[num])();
cout << "Enter 0/1: ";
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgTWFjaGluZQp7CiAgIGNsYXNzIFN0YXRlICpjdXJyZW50OwogICBjbGFzcyBTdGF0ZSAqbmV4dHN0YXRlOyAKICAgdm9pZCBjaGVja190cmFuc2l0aW9uKCk7IApwdWJsaWM6CiAgICBNYWNoaW5lKCk7CiAgICB2b2lkIHNldEN1cnJlbnQoU3RhdGUgKnMpCiAgICB7CiAgICAJbmV4dHN0YXRlID0gczsgCiAgICAgICAgLy9jdXJyZW50ID0gczsKICAgIH0KICAgIHZvaWQgc2V0X29uKCk7CiAgICB2b2lkIHNldF9vZmYoKTsKfTsKCmNsYXNzIFN0YXRlCnsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgc2V0X29uKE1hY2hpbmUgKm0pCiAgICB7CiAgICAgICAgY291dCA8PCAiICAgYWxyZWFkeSBPTlxuIjsKICAgIH0KICAgIHZpcnR1YWwgdm9pZCBzZXRfb2ZmKE1hY2hpbmUgKm0pCiAgICB7CiAgICAgICAgY291dCA8PCAiICAgYWxyZWFkeSBPRkZcbiI7CiAgICB9CiAgICB2aXJ0dWFsIH5TdGF0ZSgpe30KfTsKCnZvaWQgTWFjaGluZTo6Y2hlY2tfdHJhbnNpdGlvbigpIHsgCiAgIAkgICBpZiAobmV4dHN0YXRlKSB7CiAgIAkgICAJICAgc3dhcCAoY3VycmVudCwgbmV4dHN0YXRlKTsKICAgCSAgIAkgICBkZWxldGUgbmV4dHN0YXRlOyAgLy8gdGhpcyBjb250YWlucyB0aGUgZm9ybWVyIGN1cnJlbnQgIAogICAJICAgCSAgIG5leHRzdGF0ZSA9IG51bGxwdHI7IAogICAJICAgfQogICB9Cgp2b2lkIE1hY2hpbmU6OnNldF9vbigpCnsKICAgY3VycmVudC0+c2V0X29uKHRoaXMpOwogICBjaGVja190cmFuc2l0aW9uKCk7IAp9Cgp2b2lkIE1hY2hpbmU6OnNldF9vZmYoKQp7CiAgY3VycmVudC0+c2V0X29mZih0aGlzKTsKICBjaGVja190cmFuc2l0aW9uKCk7IAp9CgpjbGFzcyBPTjogcHVibGljIFN0YXRlCnsKICBwdWJsaWM6CiAgICBPTigpCiAgICB7CiAgICAgICAgY291dCA8PCAiICAgT04tY3RvciAiOwogICAgfTsKICAgIH5PTigpCiAgICB7CiAgICAgICAgY291dCA8PCAiICAgZHRvci1PTlxuIjsKICAgIH07CiAgICB2b2lkIHNldF9vZmYoTWFjaGluZSAqbSk7Cn07CgpjbGFzcyBPRkY6IHB1YmxpYyBTdGF0ZQp7CiAgcHVibGljOgogICAgT0ZGKCkKICAgIHsKICAgICAgICBjb3V0IDw8ICIgICBPRkYtY3RvciAiOwogICAgfTsKICAgIH5PRkYoKQogICAgewogICAgICAgIGNvdXQgPDwgIiAgIGR0b3ItT0ZGXG4iOwogICAgfTsKICAgIHZvaWQgc2V0X29uKE1hY2hpbmUgKm0pCiAgICB7CiAgICAgICAgY291dCA8PCAiICAgZ29pbmcgZnJvbSBPRkYgdG8gT04iOwogICAgICAgIG0tPnNldEN1cnJlbnQobmV3IE9OKCkpOwogICAgfQp9OwoKdm9pZCBPTjo6c2V0X29mZihNYWNoaW5lICptKQp7CiAgY291dCA8PCAiICAgZ29pbmcgZnJvbSBPTiB0byBPRkYiOwogIG0tPnNldEN1cnJlbnQobmV3IE9GRigpKTsKfQoKTWFjaGluZTo6TWFjaGluZSgpIAp7CgluZXh0c3RhdGUgPSBudWxscHRyOyAKICAgIGN1cnJlbnQgPSBuZXcgT0ZGKCk7CiAgICBjb3V0IDw8ICdcbic7Cn0KCmludCBtYWluKCkKewogIHZvaWQoTWFjaGluZTo6ICpwdHJzW10pKCkgPSAKICB7CiAgICAmTWFjaGluZTo6c2V0X29mZiwgJk1hY2hpbmU6OnNldF9vbgogIH07CiAgTWFjaGluZSBmc207CiAgaW50IG51bTsKICBjb3V0IDw8ICJFbnRlciAwLzE6ICI7CgogIHdoaWxlIChjaW4gPj4gbnVtKQogIHsKICAgICAKICAgIChmc20uKnB0cnNbbnVtXSkoKTsKICAgY291dCA8PCAiRW50ZXIgMC8xOiAiOwogIH0KfQ==