#include <iostream>
enum statetype {firststate, secondstate, stopstate};
void dofirststate() {
//does stuff
std::cout << "HI! ";
throw secondstate;
}
void dosecondstate() {
//does stuff
std::cout << "BYE!";
throw stopstate;
}
int main() {
statetype curstate = firststate;
while (curstate!= stopstate) {
try {
switch (curstate) {
case firststate: dofirststate();
case secondstate: dosecondstate();
}
} catch(statetype& s) {
curstate = s;
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKZW51bSBzdGF0ZXR5cGUge2ZpcnN0c3RhdGUsIHNlY29uZHN0YXRlLCBzdG9wc3RhdGV9OwoKdm9pZCBkb2ZpcnN0c3RhdGUoKSB7CiAgICAvL2RvZXMgc3R1ZmYKICAgIHN0ZDo6Y291dCA8PCAiSEkhICI7CiAgICB0aHJvdyBzZWNvbmRzdGF0ZTsKfQoKdm9pZCBkb3NlY29uZHN0YXRlKCkgewogICAgLy9kb2VzIHN0dWZmCiAgICBzdGQ6OmNvdXQgPDwgIkJZRSEiOwogICAgdGhyb3cgc3RvcHN0YXRlOwp9CgppbnQgbWFpbigpIHsKICAgc3RhdGV0eXBlIGN1cnN0YXRlID0gZmlyc3RzdGF0ZTsKICAgd2hpbGUgKGN1cnN0YXRlIT0gc3RvcHN0YXRlKSB7IAogICAgICAgdHJ5IHsKICAgICAgICAgICBzd2l0Y2ggKGN1cnN0YXRlKSB7CiAgICAgICAgICAgY2FzZSBmaXJzdHN0YXRlOiBkb2ZpcnN0c3RhdGUoKTsKICAgICAgICAgICBjYXNlIHNlY29uZHN0YXRlOiBkb3NlY29uZHN0YXRlKCk7CiAgICAgICAgICAgfQogICAgICAgfSBjYXRjaChzdGF0ZXR5cGUmIHMpIHsKICAgICAgICAgICBjdXJzdGF0ZSA9IHM7CiAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQogICAgICAg