1#ifndef __COMMON_HAS_SERIALIZE_HPP__
2#define __COMMON_HAS_SERIALIZE_HPP__
4#include <Kokkos_Core.hpp>
5#include <biocma_cst_config.hpp>
9#define IF_ENABLE_CEREAL_SERDE \
10 typename std::enable_if< \
11 AutoGenerated::FlagCompileTime::use_cereal_serde>::type
15 template <
typename,
typename T>
struct __has_serialize
17 static_assert(std::integral_constant<T, false>::value,
18 "Second template parameter needs to be of function type.");
23 template <
typename C,
typename Ret,
typename... Args>
24 struct __has_serialize<C, Ret(Args...)>
28 static constexpr auto check(T*) ->
typename std::is_same<
29 decltype(std::declval<T>().serialize(std::declval<Args>()...)),
32 template <
typename>
static constexpr std::false_type check(...);
34 using type =
decltype(check<C>(0));
37 static constexpr bool value = type::value;
40 template <
class ViewType,
typename Enable =
void>
struct ViewSerialization;
43 template <
class ViewType>
44 struct ViewSerialization<
46 typename std::enable_if<
48 && AutoGenerated::FlagCompileTime::use_cereal_serde>::type>
50 template <
class Archive>
52 serialize(Archive& ar,
const ViewType& view, std::size_t n_used_elements)
54 using T =
typename ViewType::value_type;
55 auto temp_host = Kokkos::create_mirror_view_and_copy(
56 Kokkos::DefaultHostExecutionSpace(), view);
57 std::vector<T> data_vector(temp_host.data(),
58 temp_host.data() + n_used_elements);
62 template <
class Archive>
64 deserialize(Archive& ar, ViewType& view)
66 using T =
typename ViewType::value_type;
68 std::vector<T> data_vector;
71 view = ViewType(
"deser", data_vector.size());
73 auto tmpdata = ViewType(data_vector.data(), data_vector.size());
74 Kokkos::deep_copy(view, tmpdata);
79 template <
class ViewType>
80 struct ViewSerialization<
82 typename std::enable_if<
84 && AutoGenerated::FlagCompileTime::use_cereal_serde>::type>
86 template <
class Archive>
88 serialize(Archive& ar,
const ViewType& view, std::size_t n_used_elements)
90 (void)n_used_elements;
91 using T =
typename ViewType::value_type;
92 auto temp_host = Kokkos::create_mirror_view_and_copy(
93 Kokkos::DefaultHostExecutionSpace(), view);
94 const auto rows = view.extent(0);
95 const auto cols = view.extent(1);
98 std::vector<T> data_vector(temp_host.data(),
99 temp_host.data() + rows * cols);
103 template <
class Archive>
105 deserialize(Archive& ar, ViewType& view)
107 using T =
typename ViewType::value_type;
108 using L =
typename ViewType::array_layout;
111 std::vector<T> data_vector;
114 view = ViewType(
"deser", rows, cols);
115 auto tmpdata = ViewType(data_vector.data(), L(rows, cols));
117 Kokkos::deep_copy(view, tmpdata);
123template <
class C,
typename T>
127 return __has_serialize<C, void(T&)>::value;
131template <
class Archive,
class ViewType>
133serialize_view(Archive& archive,
const ViewType& view)
136 ViewSerialization<ViewType>::serialize(archive, view, view.extent(0));
140template <
class Archive,
class ViewType>
142deserialize_view(Archive& archive, ViewType& view)
144 ViewSerialization<ViewType>::deserialize(archive, view);