25 #ifndef GRIDCONTAINER_SERIALIZATION_TUPLE_H 26 #define GRIDCONTAINER_SERIALIZATION_TUPLE_H 29 #include <type_traits> 31 #include <boost/serialization/split_free.hpp> 34 namespace serialization {
44 template<
typename Archive,
typename... Args>
45 static void save(Archive& ar,
const std::tuple<Args...>& t,
const unsigned int version,
46 typename std::enable_if<std::is_default_constructible<
typename std::tuple_element<N-1, std::tuple<Args...>>::type>::value>::type* = 0) {
47 ar << std::get<
N-1>(t);
54 template<
typename Archive,
typename... Args>
55 static void save(Archive& ar,
const std::tuple<Args...>& t,
const unsigned int version,
56 typename std::enable_if<!std::is_default_constructible<
typename std::tuple_element<N-1, std::tuple<Args...>>::type>::value>::type* = 0) {
59 typename std::remove_reference<decltype(std::get<N-1>(t))>::type* ptr = &std::get<
N-1>(t);
70 template<
typename Archive,
typename... Args>
71 static void save(Archive&,
const std::tuple<Args...>&,
const unsigned int) { }
84 template<
typename Archive,
typename... Args>
85 static void load(Archive& ar, std::tuple<Args...>& t,
const unsigned int version,
86 typename std::enable_if<std::is_default_constructible<
typename std::tuple_element<N-1, std::tuple<Args...>>::type>::value>::type* = 0) {
87 ar >> std::get<
N-1>(t);
95 template<
typename Archive,
typename... Args>
96 static void load(Archive& ar, std::tuple<Args...>& t,
const unsigned int version,
97 typename std::enable_if<!std::is_default_constructible<
typename std::tuple_element<N-1, std::tuple<Args...>>::type>::value>::type* = 0) {
98 typedef typename std::remove_reference<decltype(std::get<N-1>(t))>::type ElementType;
102 std::unique_ptr<ElementType> deleter {ptr};
103 std::get<
N-1>(t) = *deleter;
113 template<
typename Archive,
typename... Args>
114 static void load(Archive&, std::tuple<Args...>&,
const unsigned int) { }
119 template<
typename Archive,
typename... Args>
120 void save(Archive& ar,
const std::tuple<Args...>& t,
const unsigned int version) {
121 Save<
sizeof...(Args)>::
save(ar, t, version);
126 template<
typename Archive,
typename... Args>
127 void load(Archive& ar, std::tuple<Args...>& t,
const unsigned int version) {
128 Load<
sizeof...(Args)>::
load(ar, t, version);
133 template<
typename Archive,
typename... Args>
134 void serialize(Archive& ar, std::tuple<Args...>& t,
const unsigned int version) {
135 split_free(ar, t, version);
static void save(Archive &ar, const std::tuple< Args... > &t, const unsigned int version, typename std::enable_if< std::is_default_constructible< typename std::tuple_element< N-1, std::tuple< Args... >>::type >::value >::type *=0)
void load(Archive &ar, Euclid::GridContainer::GridContainer< GridCellManager, AxesTypes... > &grid, const unsigned int, typename std::enable_if< std::is_default_constructible< typename Euclid::GridContainer::GridCellManagerTraits< GridCellManager >::data_type >::value >::type *=0)
static void load(Archive &ar, std::tuple< Args... > &t, const unsigned int version, typename std::enable_if<!std::is_default_constructible< typename std::tuple_element< N-1, std::tuple< Args... >>::type >::value >::type *=0)
static void save(Archive &, const std::tuple< Args... > &, const unsigned int)
This method does nothing. It exists to break the recursion.
static void load(Archive &ar, std::tuple< Args... > &t, const unsigned int version, typename std::enable_if< std::is_default_constructible< typename std::tuple_element< N-1, std::tuple< Args... >>::type >::value >::type *=0)
void serialize(Archive &archive, std::array< CellType, ND > &array, const unsigned int)
static void save(Archive &ar, const std::tuple< Args... > &t, const unsigned int version, typename std::enable_if<!std::is_default_constructible< typename std::tuple_element< N-1, std::tuple< Args... >>::type >::value >::type *=0)
void save(Archive &ar, const Euclid::GridContainer::GridContainer< GridCellManager, AxesTypes... > &grid, const unsigned int, typename std::enable_if< std::is_default_constructible< typename Euclid::GridContainer::GridCellManagerTraits< GridCellManager >::data_type >::value >::type *=0)
static void load(Archive &, std::tuple< Args... > &, const unsigned int)
This method does nothing. It exists to break the recursion.