Commit d8b30f1c authored by Dominik Charousset's avatar Dominik Charousset

Fix exception handling in announce_1

parent a95ded47
......@@ -8,6 +8,7 @@
#include "caf/binary_deserializer.hpp"
using std::cout;
using std::cerr;
using std::endl;
using std::vector;
......@@ -21,8 +22,7 @@ struct foo {
// announce requires foo to have the equal operator implemented
bool operator==(const foo& lhs, const foo& rhs) {
return lhs.a == rhs.a
&& lhs.b == rhs.b;
return lhs.a == rhs.a && lhs.b == rhs.b;
}
// a pair of two ints
......@@ -37,7 +37,7 @@ struct foo2 {
vector<vector<double>> b;
};
bool operator==( const foo2& lhs, const foo2& rhs ) {
bool operator==(const foo2& lhs, const foo2& rhs) {
return lhs.a == rhs.a && lhs.b == rhs.b;
}
......@@ -74,40 +74,42 @@ void testee(event_based_actor* self, size_t remaining) {
}
int main(int, char**) {
// announces foo to the libcaf type system;
// the function expects member pointers to all elements of foo
announce<foo>("foo", &foo::a, &foo::b);
// announce foo2 to the libcaf type system,
// note that recursive containers are managed automatically by libcaf
announce<foo2>("foo2", &foo2::a, &foo2::b);
// serialization can throw if types are not announced properly
try {
// init some test data
foo2 vd;
vd.a = 5;
vd.b.resize(1);
vd.b.back().push_back(42);
// serialize test data
vector<char> buf;
binary_serializer bs(std::back_inserter(buf));
bs << vd;
// deserialize written test data from buffer
binary_deserializer bd(buf.data(), buf.size());
foo2 vd2;
uniform_typeid<foo2>()->deserialize(&vd2, &bd);
// deserialized data must be equal to original input
assert(vd == vd2);
// announce std::pair<int, int> to the type system
announce<foo_pair>("foo_pair", &foo_pair::first, &foo_pair::second);
// libcaf returns the same uniform_type_info
// instance for the type aliases foo_pair and foo_pair2
assert(uniform_typeid<foo_pair>() == uniform_typeid<foo_pair2>());
// spawn a testee that receives two messages
}
catch (std::exception& e) {
cerr << "error during type (de)serialization: " << e.what() << endl;
return -1;
}
// spawn a testee that receives two messages of user-defined type
auto t = spawn(testee, 2);
{
{ // lifetime scope of self
scoped_actor self;
// send t a foo
self->send(t, foo{std::vector<int>{1, 2, 3, 4}, 5});
......@@ -116,5 +118,4 @@ int main(int, char**) {
}
await_all_actors_done();
shutdown();
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment