12#include <lagrange/utils/assert.h>
13#include <lagrange/utils/warning.h>
17#if !defined(__clang__) && defined(__gnuc__)
18 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
22namespace experimental {
28 template <
typename Archive>
29 static void serialize(
ArrayBase* arr, Archive& ar)
31 if (arr->is_row_major()) {
32 using EigenType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
33 auto M = arr->template view<EigenType>();
36 using EigenType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>;
37 auto M = arr->template view<EigenType>();
42 template <
int StorageOrder,
typename Archive>
43 static std::unique_ptr<ArrayBase> deserialize(Archive& ar)
45 using EigenType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, StorageOrder>;
48 return std::make_unique<EigenArray<EigenType>>(std::move(matrix));
52template <
typename Archive>
53void serialize_array(
ArrayBase* arr, Archive& ar)
55 assert(!ar.is_input());
56 enum { SCALAR_TYPE = 0, IS_ROW_MAJOR = 1, DATA = 2 };
58 ar.object([&](
auto& ar) {
59 auto stype = arr->get_scalar_type();
60 auto is_row_major = arr->is_row_major();
61 ar(
"scalar_type", SCALAR_TYPE) & stype;
62 ar(
"is_row_major", IS_ROW_MAJOR) & is_row_major;
64 auto data_ar = ar(
"data", DATA);
67#define LAGRANGE_SERIALIZATION_ADD_CASE(type) \
68 case type: ArraySerialization<EnumToScalar_t<type>>::serialize(arr, data_ar); break;
69 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT8)
70 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT16)
71 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT32)
72 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT64)
73 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT8)
74 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT16)
75 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT32)
76 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT64)
77 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::FLOAT)
78 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::DOUBLE)
79 default:
throw std::runtime_error(
"Unsupported scalar type detected!");
80#undef LAGRANGE_SERIALIZATION_ADD_CASE
85template <
typename Archive>
86std::unique_ptr<ArrayBase> deserialize_array(Archive& ar)
88 enum { SCALAR_TYPE = 0, IS_ROW_MAJOR = 1, DATA = 2 };
89 std::unique_ptr<ArrayBase> ptr;
91 ar.object([&](
auto& ar) {
94 ar(
"scalar_type", SCALAR_TYPE) & stype;
95 ar(
"is_row_major", IS_ROW_MAJOR) & is_row_major;
97 auto data_ar = ar(
"data", DATA);
100#define LAGRANGE_SERIALIZATION_ADD_CASE(type) \
104 ? ArraySerialization<EnumToScalar_t<type>>::deserialize<Eigen::RowMajor>(data_ar) \
105 : ArraySerialization<EnumToScalar_t<type>>::deserialize<Eigen::ColMajor>(data_ar); \
107 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT8)
108 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT16)
109 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT32)
110 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::INT64)
111 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT8)
112 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT16)
113 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT32)
114 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::UINT64)
115 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::FLOAT)
116 LAGRANGE_SERIALIZATION_ADD_CASE(ScalarEnum::DOUBLE)
117 default:
throw std::runtime_error(
"Unsupported scalar type detected!");
119#undef LAGRANGE_SERIALIZATION_ADD_CASE
121 assert(ptr !=
nullptr);
134template <
typename Archive>
135void serialize(std::shared_ptr<ArrayBase>& arr, Archive& ar)
138 arr = internal::deserialize_array(ar);
140 internal::serialize_array(arr.get(), ar);
151template <
typename Archive>
152void serialize(std::unique_ptr<ArrayBase>& arr, Archive& ar)
155 arr = internal::deserialize_array(ar);
157 internal::serialize_array(arr.get(), ar);
164LA_IGNORE_SHADOW_WARNING_END
#define LA_IGNORE_SHADOW_WARNING_BEGIN
Ignore shadow warnings.
Definition warning.h:68
Main namespace for Lagrange.
Definition Array.serialization.h:27