diff --git a/src/utils/serialization.hpp b/src/utils/serialization.hpp index de9f1722b..4bf2a6be5 100644 --- a/src/utils/serialization.hpp +++ b/src/utils/serialization.hpp @@ -10,6 +10,24 @@ namespace boost::serialization { +namespace { + +template +void tuple_serialization_helper(TArchive &ar, std::tuple &tup) { + if constexpr (idx < sizeof...(Elements)) { + ar &std::get(tup); + tuple_serialization_helper(ar, tup); + } +} + +} // namespace + +template +inline void serialize(TArchive &ar, std::tuple &tup, + unsigned int) { + tuple_serialization_helper<0, TArchive, Elements...>(ar, tup); +} + template inline void serialize(TArchive &ar, std::experimental::optional &opt, unsigned int version) { @@ -38,7 +56,7 @@ void load(TArchive &ar, std::experimental::optional &opt, unsigned int) { } } -} // boost::serialization +} // namespace boost::serialization namespace utils { diff --git a/tests/unit/serialization.cpp b/tests/unit/serialization.cpp new file mode 100644 index 000000000..d8e07918e --- /dev/null +++ b/tests/unit/serialization.cpp @@ -0,0 +1,64 @@ +#include +#include + +#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 x1 = {}; + optional x2 = 42; + optional 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); +} diff --git a/tests/unit/serialization_optional.cpp b/tests/unit/serialization_optional.cpp deleted file mode 100644 index f02d8428b..000000000 --- a/tests/unit/serialization_optional.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -#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 x1 = {}; - optional x2 = 42; - optional 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); -}