// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2021 The Eigen Team // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_SERIALIZER_H #define EIGEN_SERIALIZER_H #include <type_traits> // The Serializer class encodes data into a memory buffer so it can be later // reconstructed. This is mainly used to send objects back-and-forth between // the CPU and GPU. namespace Eigen { /** * Serializes an object to a memory buffer. * * Useful for transferring data (e.g. back-and-forth to a device). */ template <typename T, typename EnableIf = void> class Serializer; // Specialization for POD types. Serializer<T, typename std::enable_if_t<std::is_trivial<T>::value && std::is_standard_layout<T>::value>>; // Specialization for DenseBase. // Serializes [rows, cols, data...]. Serializer<DenseBase<Derived>, void>; Serializer<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>; Serializer<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>; namespace internal { // Recursive serialization implementation helper. template <size_t N, typename... Types> struct serialize_impl; serialize_impl<N, T1, Ts...>; // Base case. template <> struct serialize_impl<0> { … }; } // namespace internal /** * Determine the buffer size required to serialize a set of values. * * \param args ... arguments to serialize in sequence. * \return the total size of the required buffer. */ template <typename... Args> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size(const Args&... args) { … } /** * Serialize a set of values to the byte buffer. * * \param dest output byte buffer; if this is nullptr, does nothing. * \param end the end of the output byte buffer. * \param args ... arguments to serialize in sequence. * \return the next address after all serialized values. */ template <typename... Args> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize(uint8_t* dest, uint8_t* end, const Args&... args) { … } /** * Deserialize a set of values from the byte buffer. * * \param src input byte buffer; if this is nullptr, does nothing. * \param end the end of input byte buffer. * \param args ... arguments to deserialize in sequence. * \return the next address after all parsed values; nullptr if parsing errors are detected. */ template <typename... Args> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, Args&... args) { … } } // namespace Eigen #endif // EIGEN_SERIALIZER_H