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

Add overloads for binary serializer/deserializer

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