Commit 5d6bb51a authored by Dominik Charousset's avatar Dominik Charousset

Add overloads for binary serializer/deserializer

parent 6f341143
......@@ -34,6 +34,9 @@ public:
/// Writes the content of this object to `sink`.
virtual error serialize(serializer& sink) const = 0;
/// @copydoc serialize
virtual error_code<sec> serialize(binary_serializer& sink) const = 0;
};
/// @relates tracing_data
......@@ -42,7 +45,13 @@ using tracing_data_ptr = std::unique_ptr<tracing_data>;
/// @relates tracing_data
error inspect(serializer& sink, const tracing_data_ptr& x);
/// @relates tracing_data
error_code<sec> inspect(binary_serializer& sink, const tracing_data_ptr& x);
/// @relates tracing_data
error inspect(deserializer& source, tracing_data_ptr& x);
/// @relates tracing_data
error_code<sec> inspect(binary_deserializer& source, tracing_data_ptr& x);
} // namespace caf
......@@ -32,6 +32,11 @@ public:
/// @returns the result of `source`.
virtual error deserialize(deserializer& source,
std::unique_ptr<tracing_data>& dst) const = 0;
/// @copydoc deserialize
virtual error_code<sec>
deserialize(binary_deserializer& source,
std::unique_ptr<tracing_data>& dst) const = 0;
};
} // namespace caf
......@@ -34,7 +34,10 @@ tracing_data::~tracing_data() {
// nop
}
error inspect(serializer& sink, const tracing_data_ptr& x) {
namespace {
template <class Serializer>
auto inspect_impl(Serializer& sink, const tracing_data_ptr& x) {
if (x == nullptr) {
uint8_t dummy = 0;
return sink(dummy);
......@@ -45,13 +48,15 @@ error inspect(serializer& sink, const tracing_data_ptr& x) {
return x->serialize(sink);
}
error inspect(deserializer& source, tracing_data_ptr& x) {
template <class Deserializer>
typename Deserializer::result_type
inspect_impl(Deserializer& source, tracing_data_ptr& x) {
uint8_t dummy = 0;
if (auto err = source(dummy))
return err;
if (dummy == 0) {
x.reset();
return none;
return {};
}
auto ctx = source.context();
if (ctx == nullptr)
......@@ -62,4 +67,22 @@ error inspect(deserializer& source, tracing_data_ptr& x) {
return tc->deserialize(source, x);
}
} // namespace
error inspect(serializer& sink, const tracing_data_ptr& x) {
return inspect_impl(sink, x);
}
error_code<sec> inspect(binary_serializer& sink, const tracing_data_ptr& x) {
return inspect_impl(sink, x);
}
error inspect(deserializer& source, tracing_data_ptr& x) {
return inspect_impl(source, x);
}
error_code<sec> inspect(binary_deserializer& source, tracing_data_ptr& x) {
return inspect_impl(source, x);
}
} // namespace caf
......@@ -26,8 +26,8 @@
#include "caf/actor_profiler.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/config.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/tracing_data_factory.hpp"
#ifdef CAF_ENABLE_ACTOR_PROFILER
......@@ -49,17 +49,35 @@ public:
error serialize(serializer& sink) const override {
return sink(value);
}
error_code<sec> serialize(binary_serializer& sink) const override {
return sink(value);
}
};
class dummy_tracing_data_factory : public tracing_data_factory {
public:
error deserialize(deserializer& source,
std::unique_ptr<tracing_data>& dst) const override {
return deserialize_impl(source, dst);
}
error_code<sec>
deserialize(binary_deserializer& source,
std::unique_ptr<tracing_data>& dst) const override {
return deserialize_impl(source, dst);
}
private:
template <class Deserializer>
typename Deserializer::result_type
deserialize_impl(Deserializer& source,
std::unique_ptr<tracing_data>& dst) const {
string value;
if (auto err = source(value))
return err;
dst.reset(new dummy_tracing_data(std::move(value)));
return none;
return {};
}
};
......@@ -174,14 +192,14 @@ CAF_TEST(profilers inject tracing data into asynchronous messages) {
}
CAF_TEST(tracing data is serializable) {
std::vector<byte> buf;
serializer_impl<std::vector<byte>> sink{sys, buf};
byte_buffer buf;
binary_serializer sink{sys, buf};
tracing_data_ptr data;
tracing_data_ptr copy;
data.reset(new dummy_tracing_data("iTrace"));
CAF_CHECK_EQUAL(inspect(sink, data), none);
CAF_CHECK_EQUAL(sink(data), none);
binary_deserializer source{sys, buf};
CAF_CHECK_EQUAL(inspect(source, copy), none);
CAF_CHECK_EQUAL(source(copy), none);
CAF_REQUIRE_NOT_EQUAL(copy.get(), nullptr);
CAF_CHECK_EQUAL(dynamic_cast<dummy_tracing_data&>(*copy).value, "iTrace");
}
......
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