A simple example for a delayed_send based application.
A simple example for a delayed_send based application.
#include "caf/actor_system.hpp"
#include "caf/caf_main.hpp"
#include "caf/event_based_actor.hpp"
#include <algorithm>
#include <chrono>
#include <iostream>
using std::cout;
using std::endl;
using std::pair;
using namespace std::literals;
constexpr const char* figures[] = {
"<(^.^<)",
"<(^.^)>",
"(>^.^)>",
};
struct animation_step {
size_t figure_idx;
size_t offset;
};
constexpr animation_step animation_steps[] = {
{1, 7}, {0, 7}, {0, 6}, {0, 5}, {1, 5}, {2, 5}, {2, 6},
{2, 7}, {2, 8}, {2, 9}, {2, 10}, {1, 10}, {0, 10}, {0, 9},
{1, 9}, {2, 10}, {2, 11}, {2, 12}, {2, 13}, {1, 13}, {0, 13},
{0, 12}, {0, 11}, {0, 10}, {0, 9}, {0, 8}, {0, 7}, {1, 7},
};
constexpr size_t animation_width = 20;
void draw_kirby(const animation_step& animation) {
cout.width(animation_width);
cout << '\r';
std::fill_n(std::ostream_iterator<char>{cout}, animation.offset, ' ');
cout << figures[animation.figure_idx];
cout.fill(' ');
cout.flush();
}
self->mail(update_atom_v, size_t{0}).send(self);
return {
[self](update_atom, size_t step) {
if (step == sizeof(animation_step)) {
cout << endl;
self->quit();
return;
}
draw_kirby(animation_steps[step]);
self->mail(update_atom_v, step + 1).delay(150ms).send(self);
},
};
}
}
CAF_MAIN()
Actor environment including scheduler, registry, and optional components such as a middleman.
Definition actor_system.hpp:87
Describes the behavior of an actor, i.e., provides a message handler and an optional timeout.
Definition behavior.hpp:24
A cooperatively scheduled, event-based actor implementation.
Definition event_based_actor.hpp:31
Root namespace of libcaf.
Definition abstract_actor.cpp:23
@ system
Indicates that the thread runs background activity such as logging for the actor system.