10 #ifndef EIGEN_SERIALIZER_H
11 #define EIGEN_SERIALIZER_H
13 #include <type_traits>
26 template<
typename T,
typename EnableIf =
void>
32 std::is_trivial<T>::value
33 && std::is_standard_layout<T>::value>> {
42 EIGEN_DEVICE_FUNC
size_t size(
const T& value)
const {
53 EIGEN_DEVICE_FUNC uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const T& value) {
54 if (EIGEN_PREDICT_FALSE(dest ==
nullptr))
return nullptr;
55 if (EIGEN_PREDICT_FALSE(dest +
sizeof(value) >
end))
return nullptr;
56 EIGEN_USING_STD(memcpy)
57 memcpy(dest, &value,
sizeof(value));
58 return dest +
sizeof(value);
68 EIGEN_DEVICE_FUNC
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end, T& value)
const {
69 if (EIGEN_PREDICT_FALSE(src ==
nullptr))
return nullptr;
70 if (EIGEN_PREDICT_FALSE(src +
sizeof(value) >
end))
return nullptr;
71 EIGEN_USING_STD(memcpy)
72 memcpy(&value, src,
sizeof(value));
73 return src +
sizeof(value);
79 template<
typename Derived>
80 class Serializer<DenseBase<Derived>, void> {
82 typedef typename Derived::Scalar Scalar;
85 typename Derived::Index rows;
86 typename Derived::Index cols;
89 EIGEN_DEVICE_FUNC
size_t size(
const Derived& value)
const {
90 return sizeof(Header) +
sizeof(Scalar) * value.size();
93 EIGEN_DEVICE_FUNC uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const Derived& value) {
94 if (EIGEN_PREDICT_FALSE(dest ==
nullptr))
return nullptr;
95 if (EIGEN_PREDICT_FALSE(dest + size(value) >
end))
return nullptr;
96 const size_t header_bytes =
sizeof(Header);
97 const size_t data_bytes =
sizeof(Scalar) * value.size();
98 Header header = {value.rows(), value.cols()};
99 EIGEN_USING_STD(memcpy)
100 memcpy(dest, &header, header_bytes);
101 dest += header_bytes;
102 memcpy(dest, value.data(), data_bytes);
103 return dest + data_bytes;
106 EIGEN_DEVICE_FUNC
const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end, Derived& value)
const {
107 if (EIGEN_PREDICT_FALSE(src ==
nullptr))
return nullptr;
108 if (EIGEN_PREDICT_FALSE(src +
sizeof(Header) >
end))
return nullptr;
109 const size_t header_bytes =
sizeof(Header);
111 EIGEN_USING_STD(memcpy)
112 memcpy(&header, src, header_bytes);
114 const size_t data_bytes =
sizeof(Scalar) * header.rows * header.cols;
115 if (EIGEN_PREDICT_FALSE(src + data_bytes >
end))
return nullptr;
116 value.resize(header.rows, header.cols);
117 memcpy(value.data(), src, data_bytes);
118 return src + data_bytes;
122 template<
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
123 class Serializer<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > :
public
124 Serializer<DenseBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > > {};
126 template<
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
127 class Serializer<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > :
public
128 Serializer<DenseBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > > {};
133 template<
size_t N,
typename... Types>
134 struct serialize_impl;
136 template<
size_t N,
typename T1,
typename... Ts>
137 struct serialize_impl<N, T1, Ts...> {
140 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
142 Serializer serializer;
143 size_t size = serializer.size(value);
144 return size + serialize_impl<N-1, Ts...>::serialize_size(args...);
147 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
148 uint8_t*
serialize(uint8_t* dest, uint8_t*
end,
const T1& value,
const Ts&... args) {
149 Serializer serializer;
150 dest = serializer.serialize(dest,
end, value);
151 return serialize_impl<N-1, Ts...>::serialize(dest,
end, args...);
154 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
155 const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end, T1& value, Ts&... args) {
156 Serializer serializer;
157 src = serializer.deserialize(src,
end, value);
158 return serialize_impl<N-1, Ts...>::deserialize(src,
end, args...);
164 struct serialize_impl<0> {
165 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
168 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
169 uint8_t*
serialize(uint8_t* dest, uint8_t* ) {
return dest; }
171 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
172 const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t* ) {
return src; }
184 template<
typename... Args>
185 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
187 return internal::serialize_impl<
sizeof...(args), Args...>::
serialize_size(args...);
198 template<
typename... Args>
199 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
201 return internal::serialize_impl<
sizeof...(args), Args...>::
serialize(dest,
end, args...);
212 template<
typename... Args>
213 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
214 const uint8_t*
deserialize(
const uint8_t* src,
const uint8_t*
end, Args&... args) {
215 return internal::serialize_impl<
sizeof...(args), Args...>::
deserialize(src,
end, args...);
Definition: Serializer.h:27
static const lastp1_t end
Definition: IndexedViewHelper.h:183
Namespace containing all symbols from the Eigen library.
Definition: Core:139
uint8_t * serialize(uint8_t *dest, uint8_t *end, const Args &... args)
Definition: Serializer.h:200
size_t serialize_size(const Args &... args)
Definition: Serializer.h:186
const uint8_t * deserialize(const uint8_t *src, const uint8_t *end, Args &... args)
Definition: Serializer.h:214