Serializer.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2021 The Eigen Team
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_SERIALIZER_H
11 #define EIGEN_SERIALIZER_H
12 
13 #include <type_traits>
14 
15 // The Serializer class encodes data into a memory buffer so it can be later
16 // reconstructed. This is mainly used to send objects back-and-forth between
17 // the CPU and GPU.
18 
19 namespace Eigen {
20 
26 template <typename T, typename EnableIf = void>
27 class Serializer;
28 
29 // Specialization for POD types.
30 template <typename T>
31 class Serializer<T, typename std::enable_if_t<std::is_trivial<T>::value && std::is_standard_layout<T>::value>> {
32  public:
39  EIGEN_DEVICE_FUNC size_t size(const T& value) const { return sizeof(value); }
40 
49  if (EIGEN_PREDICT_FALSE(dest == nullptr)) return nullptr;
50  if (EIGEN_PREDICT_FALSE(dest + sizeof(value) > end)) return nullptr;
51  EIGEN_USING_STD(memcpy)
52  memcpy(dest, &value, sizeof(value));
53  return dest + sizeof(value);
54  }
55 
63  EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, T& value) const {
64  if (EIGEN_PREDICT_FALSE(src == nullptr)) return nullptr;
65  if (EIGEN_PREDICT_FALSE(src + sizeof(value) > end)) return nullptr;
66  EIGEN_USING_STD(memcpy)
67  memcpy(&value, src, sizeof(value));
68  return src + sizeof(value);
69  }
70 };
71 
72 // Specialization for DenseBase.
73 // Serializes [rows, cols, data...].
74 template <typename Derived>
75 class Serializer<DenseBase<Derived>, void> {
76  public:
77  typedef typename Derived::Scalar Scalar;
78 
79  struct Header {
80  typename Derived::Index rows;
81  typename Derived::Index cols;
82  };
83 
84  EIGEN_DEVICE_FUNC size_t size(const Derived& value) const { return sizeof(Header) + sizeof(Scalar) * value.size(); }
85 
87  if (EIGEN_PREDICT_FALSE(dest == nullptr)) return nullptr;
88  if (EIGEN_PREDICT_FALSE(dest + size(value) > end)) return nullptr;
89  const size_t header_bytes = sizeof(Header);
90  const size_t data_bytes = sizeof(Scalar) * value.size();
91  Header header = {value.rows(), value.cols()};
92  EIGEN_USING_STD(memcpy)
93  memcpy(dest, &header, header_bytes);
94  dest += header_bytes;
95  memcpy(dest, value.data(), data_bytes);
96  return dest + data_bytes;
97  }
98 
99  EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, Derived& value) const {
100  if (EIGEN_PREDICT_FALSE(src == nullptr)) return nullptr;
101  if (EIGEN_PREDICT_FALSE(src + sizeof(Header) > end)) return nullptr;
102  const size_t header_bytes = sizeof(Header);
103  Header header;
104  EIGEN_USING_STD(memcpy)
105  memcpy(&header, src, header_bytes);
106  src += header_bytes;
107  const size_t data_bytes = sizeof(Scalar) * header.rows * header.cols;
108  if (EIGEN_PREDICT_FALSE(src + data_bytes > end)) return nullptr;
109  value.resize(header.rows, header.cols);
110  memcpy(value.data(), src, data_bytes);
111  return src + data_bytes;
112  }
113 };
114 
115 template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
116 class Serializer<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
117  : public Serializer<DenseBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
118 
119 template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
120 class Serializer<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
121  : public Serializer<DenseBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
122 
123 namespace internal {
124 
125 // Recursive serialization implementation helper.
126 template <size_t N, typename... Types>
128 
129 template <size_t N, typename T1, typename... Ts>
130 struct serialize_impl<N, T1, Ts...> {
132 
133  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size(const T1& value, const Ts&... args) {
134  Serializer serializer;
135  size_t size = serializer.size(value);
137  }
138 
140  const Ts&... args) {
141  Serializer serializer;
142  dest = serializer.serialize(dest, end, value);
144  }
145 
147  T1& value, Ts&... args) {
148  Serializer serializer;
149  src = serializer.deserialize(src, end, value);
151  }
152 };
153 
154 // Base case.
155 template <>
156 struct serialize_impl<0> {
158 
159  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize(uint8_t* dest, uint8_t* /*end*/) { return dest; }
160 
161  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t* deserialize(const uint8_t* src, const uint8_t* /*end*/) {
162  return src;
163  }
164 };
165 
166 } // namespace internal
167 
174 template <typename... Args>
176  return internal::serialize_impl<sizeof...(args), Args...>::serialize_size(args...);
177 }
178 
187 template <typename... Args>
189  return internal::serialize_impl<sizeof...(args), Args...>::serialize(dest, end, args...);
190 }
191 
200 template <typename... Args>
202  Args&... args) {
203  return internal::serialize_impl<sizeof...(args), Args...>::deserialize(src, end, args...);
204 }
205 
206 } // namespace Eigen
207 
208 #endif // EIGEN_SERIALIZER_H
#define EIGEN_USING_STD(FUNC)
Definition: Macros.h:1090
#define EIGEN_PREDICT_FALSE(x)
Definition: Macros.h:1179
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
void serialize(Archive &ar, Vec3D &v)
Definition: Utilities.h:18
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:44
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Derived::Scalar Scalar
Definition: Serializer.h:77
EIGEN_DEVICE_FUNC uint8_t * serialize(uint8_t *dest, uint8_t *end, const Derived &value)
Definition: Serializer.h:86
EIGEN_DEVICE_FUNC size_t size(const Derived &value) const
Definition: Serializer.h:84
EIGEN_DEVICE_FUNC const uint8_t * deserialize(const uint8_t *src, const uint8_t *end, Derived &value) const
Definition: Serializer.h:99
EIGEN_DEVICE_FUNC const uint8_t * deserialize(const uint8_t *src, const uint8_t *end, T &value) const
Definition: Serializer.h:63
EIGEN_DEVICE_FUNC uint8_t * serialize(uint8_t *dest, uint8_t *end, const T &value)
Definition: Serializer.h:48
Definition: Serializer.h:27
@ N
Definition: constructor.cpp:22
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
if(UPLO(*uplo)==INVALID) info
Definition: level3_impl.h:428
std::uint8_t uint8_t
Definition: Meta.h:36
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
squared absolute value
Definition: GlobalFunctions.h:87
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t * deserialize(const uint8_t *src, const uint8_t *end, Args &... args)
Definition: Serializer.h:201
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size(const Args &... args)
Definition: Serializer.h:175
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t * serialize(uint8_t *dest, uint8_t *end, const Args &... args)
Definition: Serializer.h:188
args
Definition: compute_granudrum_aor.py:143
Definition: Eigen_Colamd.h:49
Derived::Index cols
Definition: Serializer.h:81
Derived::Index rows
Definition: Serializer.h:80
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t * serialize(uint8_t *dest, uint8_t *)
Definition: Serializer.h:159
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size()
Definition: Serializer.h:157
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t * deserialize(const uint8_t *src, const uint8_t *)
Definition: Serializer.h:161
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t * serialize(uint8_t *dest, uint8_t *end, const T1 &value, const Ts &... args)
Definition: Serializer.h:139
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t * deserialize(const uint8_t *src, const uint8_t *end, T1 &value, Ts &... args)
Definition: Serializer.h:146
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size(const T1 &value, const Ts &... args)
Definition: Serializer.h:133
Definition: Serializer.h:127