Add tuple serialization

Reviewers: mferencevic

Reviewed By: mferencevic

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D1337
This commit is contained in:
Marin Tomic 2018-04-04 16:34:18 +02:00
parent eb30ecb6a0
commit 5f53a7a759
3 changed files with 83 additions and 34 deletions

View File

@ -10,6 +10,24 @@
namespace boost::serialization {
namespace {
template <size_t idx, class TArchive, class... Elements>
void tuple_serialization_helper(TArchive &ar, std::tuple<Elements...> &tup) {
if constexpr (idx < sizeof...(Elements)) {
ar &std::get<idx>(tup);
tuple_serialization_helper<idx + 1, TArchive, Elements...>(ar, tup);
}
}
} // namespace
template <class TArchive, class... Elements>
inline void serialize(TArchive &ar, std::tuple<Elements...> &tup,
unsigned int) {
tuple_serialization_helper<0, TArchive, Elements...>(ar, tup);
}
template <class TArchive, class T>
inline void serialize(TArchive &ar, std::experimental::optional<T> &opt,
unsigned int version) {
@ -38,7 +56,7 @@ void load(TArchive &ar, std::experimental::optional<T> &opt, unsigned int) {
}
}
} // boost::serialization
} // namespace boost::serialization
namespace utils {

View File

@ -0,0 +1,64 @@
#include <experimental/optional>
#include <sstream>
#include "gtest/gtest.h"
#include "boost/archive/binary_iarchive.hpp"
#include "boost/archive/binary_oarchive.hpp"
#include "utils/serialization.hpp"
using std::experimental::optional;
using std::string_literals::operator""s;
TEST(Serialization, Optional) {
std::stringstream ss;
optional<int> x1 = {};
optional<int> x2 = 42;
optional<int> y1, y2;
{
boost::archive::binary_oarchive ar(ss);
ar << x1;
ar << x2;
}
{
boost::archive::binary_iarchive ar(ss);
ar >> y1;
ar >> y2;
}
EXPECT_EQ(x1, y1);
EXPECT_EQ(x2, y2);
}
TEST(Serialization, Tuple) {
std::stringstream ss;
auto x1 = std::make_tuple("foo"s, 42, std::experimental::make_optional(3.14));
auto x2 = std::make_tuple();
auto x3 = std::make_tuple(1, 2, 3, 4, 5);
decltype(x1) y1;
decltype(x2) y2;
decltype(x3) y3;
{
boost::archive::binary_oarchive ar(ss);
ar << x1;
ar << x2;
ar << x3;
}
{
boost::archive::binary_iarchive ar(ss);
ar >> y1;
ar >> y2;
ar >> y3;
}
EXPECT_EQ(x1, y1);
EXPECT_EQ(x2, y2);
EXPECT_EQ(x3, y3);
}

View File

@ -1,33 +0,0 @@
#include <experimental/optional>
#include <sstream>
#include "gtest/gtest.h"
#include "boost/archive/binary_iarchive.hpp"
#include "boost/archive/binary_oarchive.hpp"
#include "utils/serialization.hpp"
using std::experimental::optional;
TEST(SerializationOptionalTest, SerializeAndDeserialize) {
std::stringstream ss;
optional<int> x1 = {};
optional<int> x2 = 42;
optional<int> y1, y2;
{
boost::archive::binary_oarchive ar(ss);
ar << x1;
ar << x2;
}
{
boost::archive::binary_iarchive ar(ss);
ar >> y1;
ar >> y2;
}
EXPECT_EQ(x1, y1);
EXPECT_EQ(x2, y2);
}