state_machine_cpp
example_ForLoop_main.cpp
Go to the documentation of this file.
1 //
2 // Created by henri on 10/05/21.
3 //
4 
5 #include <iostream>
6 #include "basics.h"
7 
8 using namespace state_machine_cpp;
9 
10 class ForLoop final : public Algorithm::Builder {
11 public:
12 
13  struct Attributes {
14  int iteration = 0;
16  explicit Attributes(int max_iteration) : max_iteration(max_iteration) {}
17  };
18 
20  return new AttributeTree<Layer<ForLoop::Attributes>>(new Layer(new Attributes(max_iteration)));
21  }
22 
23  static const State::Id INITIAL_STATE;
27  static const State::Id FINAL_STATE;
28 
29  static void print_end_of_loop(Context& context) {
30  std::cout << "The loop is over" << std::endl;
31  }
32 
33  static void initialize_counter(Context& context) {
34  auto& attributes = context.get<Attributes>();
35  attributes.iteration = 0;
36  }
37 
38  static bool evaluate_loop_condition(const Context& context) {
39  auto& attributes = context.get<Attributes>();
40  return attributes.iteration < attributes.max_iteration;
41  }
42 
43  static void apply_loop_effect(Context& context) {
44  std::cout << context.get<Attributes>().iteration << std::endl;
45  }
46 
47  static void increment_counter(Context& context) {
48  context.get<Attributes>().iteration++;
49  }
50 
51  void build(States &states, Transitions &transitions, Layers &layers) override {
52 
53  states.create(INITIAL_STATE);
54  states.create(LOOP_CONDITION_EVALUATION);
55  states.create(BEGIN_OF_ITERATION);
56  states.create(END_OF_ITERATION);
57  states.create(FINAL_STATE);
58 
59  transitions.create(INITIAL_STATE, LOOP_CONDITION_EVALUATION, initialize_counter, "$iteration = 0");
60  transitions.create_if(LOOP_CONDITION_EVALUATION, BEGIN_OF_ITERATION, FINAL_STATE,evaluate_loop_condition, "$iteration < $max_iteration");
61  transitions.create(BEGIN_OF_ITERATION, END_OF_ITERATION, apply_loop_effect, "show $iteration");
62  transitions.create(END_OF_ITERATION, LOOP_CONDITION_EVALUATION, increment_counter, "$iteration++");
63  transitions.create(FINAL_STATE, FINAL_STATE, print_end_of_loop);
64 
65  }
66 
67 };
68 
69 const State::Id ForLoop::INITIAL_STATE = State::Id("ForLoop::INITIAL_STATE");
70 const State::Id ForLoop::LOOP_CONDITION_EVALUATION = State::Id("ForLoop::LOOP_CONDITION_EVALUATION");
71 const State::Id ForLoop::BEGIN_OF_ITERATION = State::Id("ForLoop::BEGIN_OF_ITERATION");
72 const State::Id ForLoop::END_OF_ITERATION = State::Id("ForLoop::END_OF_ITERATION");
73 const State::Id ForLoop::FINAL_STATE = State::Id("ForLoop::FINAL_STATE");
74 
75 #ifndef STATE_MACHINE_CPP_EXAMPLE_FORLOOP_H
76 
77 int main() {
78 
79  Algorithm::Instance algorithm;
80  Algorithm::build<ForLoop>(algorithm);
81  Algorithm::plot(algorithm, "my_algorithm", true);
82  Algorithm::sanity_check(algorithm);
83 
84  //auto context_tree = ForLoop::create_attributes(10);
85  //Context context(context_tree);
86  auto context = Context::create<ForLoop>(10);
87 
88  Algorithm::run(algorithm, context);
89 
90  return 0;
91 }
92 
93 #endif // STATE_MACHINE_CPP_EXAMPLE_FORLOOP_H
ForLoop::Attributes::max_iteration
int max_iteration
Definition: example_ForLoop_main.cpp:15
state_machine_cpp::State::Id
Definition: state_id.h:23
ForLoop::BEGIN_OF_ITERATION
static const State::Id BEGIN_OF_ITERATION
Definition: example_ForLoop_main.cpp:25
state_machine_cpp::Algorithm::Builder::Transitions::create
void create(const State::Any &t_initial_state, const State::Any &t_next_state, Transition::TrivialHandler &t_handler, std::string t_description="")
state_machine_cpp::Algorithm::Builder::Transitions::create_if
void create_if(const State::Any &t_initial_state, const State::Any &t_if_true, const State::Any &t_else, Transition::ConditionalHandler &t_handler, std::string t_description="")
state_machine_cpp::Algorithm::plot
void plot(const Algorithm::Instance &t_algorithm, const std::string &t_filename, bool t_run_command=true)
ForLoop::Attributes::Attributes
Attributes(int max_iteration)
Definition: example_ForLoop_main.cpp:16
ForLoop::END_OF_ITERATION
static const State::Id END_OF_ITERATION
Definition: example_ForLoop_main.cpp:26
state_machine_cpp::Algorithm::run
void run(const Algorithm::Instance &t_instance, Context &t_context)
state_machine_cpp::Algorithm::Builder::Layers
Definition: builder_layers.h:10
ForLoop::INITIAL_STATE
static const State::Id INITIAL_STATE
Definition: example_ForLoop_main.cpp:23
ForLoop::apply_loop_effect
static void apply_loop_effect(Context &context)
Definition: example_ForLoop_main.cpp:43
state_machine_cpp::Algorithm::Instance
Definition: algorithm.h:23
ForLoop::Attributes
Definition: example_ForLoop_main.cpp:13
state_machine_cpp::Algorithm::Builder::States
Definition: builder_states.h:10
ForLoop::LOOP_CONDITION_EVALUATION
static const State::Id LOOP_CONDITION_EVALUATION
Definition: example_ForLoop_main.cpp:24
ForLoop::Attributes::iteration
int iteration
Definition: example_ForLoop_main.cpp:14
ForLoop::increment_counter
static void increment_counter(Context &context)
Definition: example_ForLoop_main.cpp:47
state_machine_cpp
Definition: algorithm.h:14
ForLoop::build
void build(States &states, Transitions &transitions, Layers &layers) override
Definition: example_ForLoop_main.cpp:51
state_machine_cpp::Algorithm::Builder::States::create
virtual void create(const State::Any &t_state)=0
state_machine_cpp::Algorithm::sanity_check
bool sanity_check(const Algorithm::Instance &t_algorithm)
ForLoop::FINAL_STATE
static const State::Id FINAL_STATE
Definition: example_ForLoop_main.cpp:27
main
int main()
Definition: example_ForLoop_main.cpp:77
state_machine_cpp::AttributeTree
Definition: attribute_tree.h:15
ForLoop::print_end_of_loop
static void print_end_of_loop(Context &context)
Definition: example_ForLoop_main.cpp:29
state_machine_cpp::Algorithm::Builder
Definition: builder.h:18
state_machine_cpp::Context::get
T & get(int t_layer=-1)
Definition: context.h:48
state_machine_cpp::Layer
Definition: layer.h:12
basics.h
state_machine_cpp::Algorithm::Builder::Transitions
Definition: builder_transitions.h:11
ForLoop::evaluate_loop_condition
static bool evaluate_loop_condition(const Context &context)
Definition: example_ForLoop_main.cpp:38
ForLoop
Definition: example_ForLoop_main.cpp:10
ForLoop::create_attributes
static AttributeTree< Layer< ForLoop::Attributes > > * create_attributes(int max_iteration)
Definition: example_ForLoop_main.cpp:19
state_machine_cpp::Context
Definition: context.h:25
ForLoop::initialize_counter
static void initialize_counter(Context &context)
Definition: example_ForLoop_main.cpp:33