Enumerations and State
Enum State Machine
Enums are useful for tracking the current state of a small process.
state machine
A state machine stores the current state and updates it according to a rule.
Enum State Machine
enum_state_machine.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>
enum class DoorState {
Closed,
Open,
Locked
};
std::string name(DoorState state) {
if (state == DoorState::Closed) {
return "closed";
}
if (state == DoorState::Open) {
return "open";
}
return "locked";
}
DoorState toggle(DoorState state) {
if (state == DoorState::Closed) {
return DoorState::Open;
}
if (state == DoorState::Open) {
return DoorState::Closed;
}
return DoorState::Locked;
}
int main() {
DoorState state = DoorState::Closed;
std::cout << "before=" << name(state) << std::endl;
state = toggle(state);
std::cout << "after=" << name(state) << std::endl;
return 0;
}
#include <iostream>
#include <string>
enum class DoorState {
Closed,
Open,
Locked
};
std::string name(DoorState state) {
if (state == DoorState::Closed) {
return "closed";
}
if (state == DoorState::Open) {
return "open";
}
return "locked";
}
DoorState toggle(DoorState state) {
if (state == DoorState::Closed) {
return DoorState::Open;
}
if (state == DoorState::Open) {
return DoorState::Closed;
}
return DoorState::Locked;
}
int main() {
DoorState state = DoorState::Open;
std::cout << "before=" << name(state) << std::endl;
state = toggle(state);
std::cout << "after=" << name(state) << std::endl;
return 0;
}
#include <iostream>
#include <string>
enum class DoorState {
Closed,
Open,
Locked
};
std::string name(DoorState state) {
if (state == DoorState::Closed) {
return "closed";
}
if (state == DoorState::Open) {
return "open";
}
return "locked";
}
DoorState toggle(DoorState state) {
if (state == DoorState::Closed) {
return DoorState::Open;
}
if (state == DoorState::Open) {
return DoorState::Closed;
}
return DoorState::Locked;
}
int main() {
DoorState state = DoorState::Locked;
std::cout << "before=" << name(state) << std::endl;
state = toggle(state);
std::cout << "after=" << name(state) << std::endl;
return 0;
}
state ← 0
30int main() {31 DoorState state→ 0 = DoorState::Closed; //@state=DoorState::Open, DoorState::Locked3233 std::cout << "before=" << name(state0) << std::endl;34 state = toggle(state);std::string name(DoorState state)
pass 1 of 210std::string name(DoorState state0) {11 if (state == DoorState::Closed) {if (state == DoorState::Closed)
10std::string name(DoorState state) {11 if (state0 == DoorState::Closed) {12 return "closed";13 }std::cout << "before=" << name(state) << std::endl;
33std::cout << "before=" << name(state0) << std::endl;34state0 = toggle(state);35std::cout << "after=" << name(state) << std::endl;outputbefore=closedDoorState toggle(DoorState state)
20DoorState toggle(DoorState state0) {21 if (state == DoorState::Closed) {if (state == DoorState::Closed)
20DoorState toggle(DoorState state) {21 if (state0 == DoorState::Closed) {22 return DoorState::Open;23 }state ← 1
33std::cout << "before=" << name(state) << std::endl;34state→ 1 = toggle(state);35std::cout << "after=" << name(state1) << std::endl;36return 0;std::string name(DoorState state)
pass 2 of 210std::string name(DoorState state1) {11 if (state == DoorState::Closed) {if (state == DoorState::Open)
13}14if (state1 == DoorState::Open) {15 return "open";16}std::cout << "after=" << name(state) << std::endl;
34 state = toggle(state);35 std::cout << "after=" << name(state1) << std::endl;36 return 0;37}outputafter=open
state ← 1
30int main() {31 DoorState state→ 1 = DoorState::Open;3233 std::cout << "before=" << name(state1) << std::endl;34 state = toggle(state);std::string name(DoorState state)
pass 1 of 210std::string name(DoorState state1) {11 if (state == DoorState::Closed) {if (state == DoorState::Open)
13}14if (state1 == DoorState::Open) {15 return "open";16}std::cout << "before=" << name(state) << std::endl;
33std::cout << "before=" << name(state1) << std::endl;34state1 = toggle(state);35std::cout << "after=" << name(state) << std::endl;outputbefore=openDoorState toggle(DoorState state)
20DoorState toggle(DoorState state1) {21 if (state == DoorState::Closed) {if (state == DoorState::Open)
23}24if (state1 == DoorState::Open) {25 return DoorState::Closed;26}state ← 0
33std::cout << "before=" << name(state) << std::endl;34state→ 0 = toggle(state);35std::cout << "after=" << name(state0) << std::endl;36return 0;std::string name(DoorState state)
pass 2 of 210std::string name(DoorState state0) {11 if (state == DoorState::Closed) {if (state == DoorState::Closed)
10std::string name(DoorState state) {11 if (state0 == DoorState::Closed) {12 return "closed";13 }std::cout << "after=" << name(state) << std::endl;
34 state = toggle(state);35 std::cout << "after=" << name(state0) << std::endl;36 return 0;37}outputafter=closed
state ← 2
30int main() {31 DoorState state→ 2 = DoorState::Locked;3233 std::cout << "before=" << name(state2) << std::endl;34 state = toggle(state);std::string name(DoorState state)
pass 1 of 210std::string name(DoorState state2) {11 if (state == DoorState::Closed) {12 return "closed";13 }14 if (state == DoorState::Open) {15 return "open";16 }17 return "locked";18}std::cout << "before=" << name(state) << std::endl;
33std::cout << "before=" << name(state2) << std::endl;34state2 = toggle(state);35std::cout << "after=" << name(state) << std::endl;outputbefore=lockedDoorState toggle(DoorState state)
20DoorState toggle(DoorState state2) {21 if (state == DoorState::Closed) {22 return DoorState::Open;23 }24 if (state == DoorState::Open) {25 return DoorState::Closed;26 }27 return DoorState::Locked;28}state = toggle(state);
33std::cout << "before=" << name(state) << std::endl;34state2 = toggle(state);35std::cout << "after=" << name(state2) << std::endl;36return 0;std::string name(DoorState state)
pass 2 of 210std::string name(DoorState state2) {11 if (state == DoorState::Closed) {12 return "closed";13 }14 if (state == DoorState::Open) {15 return "open";16 }17 return "locked";18}std::cout << "after=" << name(state) << std::endl;
34 state = toggle(state);35 std::cout << "after=" << name(state2) << std::endl;36 return 0;37}outputafter=locked