10 #ifndef EIGEN_SERIALIZER_H 11 #define EIGEN_SERIALIZER_H 13 #include <type_traits> 26 template <
typename T,
typename EnableIf =
void>
32 typename
std::enable_if_t<std::is_trivially_copyable<T>::value && std::is_standard_layout<T>::value>> {
40 EIGEN_DEVICE_FUNC
size_t size(
const T& value)
const {
return sizeof(value); }
49 EIGEN_DEVICE_FUNC uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const T& value) {
50 if (EIGEN_PREDICT_FALSE(dest ==
nullptr))
return nullptr;
51 if (EIGEN_PREDICT_FALSE(dest +
sizeof(value) >
end))
return nullptr;
52 EIGEN_USING_STD(memcpy)
53 memcpy(dest, &value,
sizeof(value));
54 return dest +
sizeof(value);
64 EIGEN_DEVICE_FUNC
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end, T& value)
const {
65 if (EIGEN_PREDICT_FALSE(src ==
nullptr))
return nullptr;
66 if (EIGEN_PREDICT_FALSE(src +
sizeof(value) >
end))
return nullptr;
67 EIGEN_USING_STD(memcpy)
68 memcpy(&value, src,
sizeof(value));
69 return src +
sizeof(value);
75 template <
typename Derived>
76 class Serializer<DenseBase<Derived>, void> {
78 typedef typename Derived::Scalar Scalar;
81 typename Derived::Index rows;
82 typename Derived::Index cols;
85 EIGEN_DEVICE_FUNC
size_t size(
const Derived& value)
const {
return sizeof(Header) +
sizeof(Scalar) * value.size(); }
87 EIGEN_DEVICE_FUNC uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const Derived& value) {
88 if (EIGEN_PREDICT_FALSE(dest ==
nullptr))
return nullptr;
89 if (EIGEN_PREDICT_FALSE(dest + size(value) >
end))
return nullptr;
90 const size_t header_bytes =
sizeof(Header);
91 const size_t data_bytes =
sizeof(Scalar) * value.size();
92 Header header = {value.rows(), value.cols()};
93 EIGEN_USING_STD(memcpy)
94 memcpy(dest, &header, header_bytes);
96 memcpy(dest, value.data(), data_bytes);
97 return dest + data_bytes;
100 EIGEN_DEVICE_FUNC
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end, Derived& value)
const {
101 if (EIGEN_PREDICT_FALSE(src ==
nullptr))
return nullptr;
102 if (EIGEN_PREDICT_FALSE(src +
sizeof(Header) >
end))
return nullptr;
103 const size_t header_bytes =
sizeof(Header);
105 EIGEN_USING_STD(memcpy)
106 memcpy(&header, src, header_bytes);
108 const size_t data_bytes =
sizeof(Scalar) * header.rows * header.cols;
109 if (EIGEN_PREDICT_FALSE(src + data_bytes >
end))
return nullptr;
110 value.resize(header.rows, header.cols);
111 memcpy(value.data(), src, data_bytes);
112 return src + data_bytes;
116 template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
117 class Serializer<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
118 :
public Serializer<DenseBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
120 template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
121 class Serializer<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
122 :
public Serializer<DenseBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
127 template <
size_t N,
typename... Types>
128 struct serialize_impl;
130 template <
size_t N,
typename T1,
typename... Ts>
131 struct serialize_impl<N, T1, Ts...> {
134 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t serialize_size(
const T1& value,
const Ts&... args) {
135 Serializer serializer;
136 size_t size = serializer.size(value);
137 return size + serialize_impl<N - 1, Ts...>::serialize_size(args...);
140 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const T1& value,
142 Serializer serializer;
143 dest = serializer.serialize(dest,
end, value);
144 return serialize_impl<N - 1, Ts...>::serialize(dest,
end, args...);
147 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end,
148 T1& value, Ts&... args) {
149 Serializer serializer;
150 src = serializer.deserialize(src,
end, value);
151 return serialize_impl<N - 1, Ts...>::deserialize(src,
end, args...);
157 struct serialize_impl<0> {
158 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t serialize_size() {
return 0; }
160 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t*
serialize(uint8_t* dest, uint8_t* ) {
return dest; }
162 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t* ) {
175 template <
typename... Args>
176 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t serialize_size(
const Args&... args) {
177 return internal::serialize_impl<
sizeof...(args), Args...>::
serialize_size(args...);
188 template <
typename... Args>
189 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const Args&... args) {
190 return internal::serialize_impl<
sizeof...(args), Args...>::
serialize(dest,
end, args...);
201 template <
typename... Args>
202 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end,
204 return internal::serialize_impl<
sizeof...(args), Args...>::
deserialize(src,
end, args...);
209 #endif // EIGEN_SERIALIZER_H static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
Definition: Serializer.h:27
Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
Definition: BFloat16.h:231
const uint8_t * deserialize(const uint8_t *src, const uint8_t *end, Args &... args)
Definition: Serializer.h:202
size_t serialize_size(const Args &... args)
Definition: Serializer.h:176
uint8_t * serialize(uint8_t *dest, uint8_t *end, const Args &... args)
Definition: Serializer.h:189