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

state
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;
}
  1. 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);
  2. std::string name(DoorState state)

    pass 1 of 2
    10std::string name(DoorState state0) {11    if (state == DoorState::Closed) {
  3. if (state == DoorState::Closed)

    10std::string name(DoorState state) {11    if (state0 == DoorState::Closed) {12        return "closed";13    }
  4. 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=closed
  5. DoorState toggle(DoorState state)

    20DoorState toggle(DoorState state0) {21    if (state == DoorState::Closed) {
  6. if (state == DoorState::Closed)

    20DoorState toggle(DoorState state) {21    if (state0 == DoorState::Closed) {22        return DoorState::Open;23    }
  7. state ← 1

    33std::cout << "before=" << name(state) << std::endl;34state→ 1 = toggle(state);35std::cout << "after=" << name(state1) << std::endl;36return 0;
  8. std::string name(DoorState state)

    pass 2 of 2
    10std::string name(DoorState state1) {11    if (state == DoorState::Closed) {
  9. if (state == DoorState::Open)

    13}14if (state1 == DoorState::Open) {15    return "open";16}
  10. 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
  1. state ← 1

    30int main() {31    DoorState state→ 1 = DoorState::Open;3233    std::cout << "before=" << name(state1) << std::endl;34    state = toggle(state);
  2. std::string name(DoorState state)

    pass 1 of 2
    10std::string name(DoorState state1) {11    if (state == DoorState::Closed) {
  3. if (state == DoorState::Open)

    13}14if (state1 == DoorState::Open) {15    return "open";16}
  4. 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=open
  5. DoorState toggle(DoorState state)

    20DoorState toggle(DoorState state1) {21    if (state == DoorState::Closed) {
  6. if (state == DoorState::Open)

    23}24if (state1 == DoorState::Open) {25    return DoorState::Closed;26}
  7. state ← 0

    33std::cout << "before=" << name(state) << std::endl;34state→ 0 = toggle(state);35std::cout << "after=" << name(state0) << std::endl;36return 0;
  8. std::string name(DoorState state)

    pass 2 of 2
    10std::string name(DoorState state0) {11    if (state == DoorState::Closed) {
  9. if (state == DoorState::Closed)

    10std::string name(DoorState state) {11    if (state0 == DoorState::Closed) {12        return "closed";13    }
  10. 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
  1. state ← 2

    30int main() {31    DoorState state→ 2 = DoorState::Locked;3233    std::cout << "before=" << name(state2) << std::endl;34    state = toggle(state);
  2. std::string name(DoorState state)

    pass 1 of 2
    10std::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}
  3. 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=locked
  4. DoorState 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}
  5. state = toggle(state);

    33std::cout << "before=" << name(state) << std::endl;34state2 = toggle(state);35std::cout << "after=" << name(state2) << std::endl;36return 0;
  6. std::string name(DoorState state)

    pass 2 of 2
    10std::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}
  7. 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