11#ifndef EIGEN_SERIALIZER_H
12#define EIGEN_SERIALIZER_H
27template <
typename T,
typename EnableIf =
void>
32class Serializer<T, 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)
const {
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);
75template <
typename Derived>
78 using Scalar =
typename Derived::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)
const {
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;
116template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
118 :
public Serializer<DenseBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
120template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
122 :
public Serializer<DenseBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
126template <
typename Arg>
127EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t serialize_size_one(
const Arg& arg) {
128 Serializer<std::decay_t<Arg>> serializer;
129 return serializer.size(arg);
132template <
typename Arg>
133EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize_one(uint8_t* dest, uint8_t* end,
const Arg& arg) {
134 Serializer<std::decay_t<Arg>> serializer;
135 return serializer.serialize(dest, end, arg);
138template <
typename Arg>
139EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const uint8_t* deserialize_one(
const uint8_t* src,
const uint8_t* end, Arg& arg) {
140 Serializer<std::decay_t<Arg>> serializer;
141 return serializer.deserialize(src, end, arg);
152template <
typename... Args>
153EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t serialize_size(
const Args&... args) {
155 int unused[] = {0, (size += internal::serialize_size_one(args), 0)...};
156 EIGEN_UNUSED_VARIABLE(unused);
168template <
typename... Args>
169EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize(uint8_t* dest, uint8_t* end,
const Args&... args) {
170 EIGEN_UNUSED_VARIABLE(end);
171 int unused[] = {0, (dest = internal::serialize_one(dest, end, args), 0)...};
172 EIGEN_UNUSED_VARIABLE(unused);
184template <
typename... Args>
185EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const uint8_t* deserialize(
const uint8_t* src,
const uint8_t* end,
187 EIGEN_UNUSED_VARIABLE(end);
188 int unused[] = {0, (src = internal::deserialize_one(src, end, args), 0)...};
189 EIGEN_UNUSED_VARIABLE(unused);
General-purpose arrays with easy API for coefficient-wise operations.
Definition Array.h:55
Base class for all dense matrices, vectors, and arrays.
Definition DenseBase.h:45
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:188
Definition Serializer.h:28