#include #include #include using namespace std; class BaseState { public: BaseState() = default; virtual ~BaseState() = default; virtual void eval(istream& sequence) const = 0; private: }; class State : public BaseState { public: State() : signals(10) {} State(State &&) = default; State(State const&) = default; State& operator=(State const&) = default; State& operator=(State &&) = default; void add_signal(BaseState* state, int condition) { signals.at(condition) = state; } void eval(istream& sequence) const override { int next_number; sequence >> next_number; try { BaseState* next = signals.at(next_number); if ( next != nullptr ) next -> eval(sequence); return; } catch ( out_of_range const& oor ) { return; } } private: vector signals; }; class EndState : public BaseState { public: using BaseState::BaseState; void eval(istream& sequence) const override { // cout << "evaling end" << endl; if ( sequence.peek() == std::istream::traits_type::eof() ) { cout << "Sequence is correct" << endl; } } private: }; int main() { State start{}; State alpha{}; EndState end{}; start.add_signal(&alpha, 1); alpha.add_signal(&start, 2); alpha.add_signal(&end, 1); try { alpha.add_signal(&end, -1); } catch(std::exception& e) { cerr << "tried to add signal out of range" << endl; } { // Test first sequence (correct) stringstream sequence{"1 1"}; cout << "testing sequence: " << sequence.str() << endl; start.eval(sequence); } { // Test second sequence (correct) stringstream sequence{"1 2 1 2 1 1"}; cout << "testing sequence: " << sequence.str() << endl; start.eval(sequence); } { // Test third sequence (incorrect) stringstream sequence{"1 1 1 2 1 1"}; cout << "testing sequence: " << sequence.str() << endl; start.eval(sequence); } { // Test fourth sequence (incorrect) stringstream sequence{"1 1 1"}; cout << "testing sequence: " << sequence.str() << endl; start.eval(sequence); } { // Test fifth sequence (incorrect) stringstream sequence{"1 5 1"}; cout << "testing sequence: " << sequence.str() << endl; start.eval(sequence); } { // Test sixth sequence (incorrect) stringstream sequence{"1 25 1"}; cout << "testing sequence: " << sequence.str() << endl; start.eval(sequence); } }