// 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/. #include "main.h" #include #include struct MyPodType { double x; int y; float z; }; // Plain-old-data serialization. void test_pod_type() { MyPodType initial = {1.3, 17, 1.9f}; MyPodType clone = {-1, -1, -1}; Eigen::Serializer serializer; // Determine required size. size_t buffer_size = serializer.size(initial); VERIFY_IS_EQUAL(buffer_size, sizeof(MyPodType)); // Serialize. std::vector buffer(buffer_size); uint8_t* dest = serializer.serialize(buffer.data(), initial); VERIFY_IS_EQUAL(dest - buffer.data(), buffer_size); // Deserialize. uint8_t* src = serializer.deserialize(buffer.data(), clone); VERIFY_IS_EQUAL(src - buffer.data(), buffer_size); VERIFY_IS_EQUAL(clone.x, initial.x); VERIFY_IS_EQUAL(clone.y, initial.y); VERIFY_IS_EQUAL(clone.z, initial.z); } // Matrix, Vector, Array template void test_eigen_type(const T& type) { const Index rows = type.rows(); const Index cols = type.cols(); const T initial = T::Random(rows, cols); // Serialize. Eigen::Serializer serializer; size_t buffer_size = serializer.size(initial); std::vector buffer(buffer_size); uint8_t* dest = serializer.serialize(buffer.data(), initial); VERIFY_IS_EQUAL(dest - buffer.data(), buffer_size); // Deserialize. T clone; uint8_t* src = serializer.deserialize(buffer.data(), clone); VERIFY_IS_EQUAL(src - buffer.data(), buffer_size); VERIFY_IS_CWISE_EQUAL(clone, initial); } // Test a collection of dense types. template void test_dense_types(const T1& type1, const T2& type2, const T3& type3) { // Make random inputs. const T1 x1 = T1::Random(type1.rows(), type1.cols()); const T2 x2 = T2::Random(type2.rows(), type2.cols()); const T3 x3 = T3::Random(type3.rows(), type3.cols()); // Allocate buffer and serialize. size_t buffer_size = Eigen::serialize_size(x1, x2, x3); std::vector buffer(buffer_size); Eigen::serialize(buffer.data(), x1, x2, x3); // Clone everything. T1 y1; T2 y2; T3 y3; Eigen::deserialize(buffer.data(), y1, y2, y3); // Verify they equal. VERIFY_IS_CWISE_EQUAL(y1, x1); VERIFY_IS_CWISE_EQUAL(y2, x2); VERIFY_IS_CWISE_EQUAL(y3, x3); } EIGEN_DECLARE_TEST(serializer) { CALL_SUBTEST( test_pod_type() ); for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST( test_eigen_type(Eigen::Array33f()) ); CALL_SUBTEST( test_eigen_type(Eigen::ArrayXd(10)) ); CALL_SUBTEST( test_eigen_type(Eigen::Vector3f()) ); CALL_SUBTEST( test_eigen_type(Eigen::Matrix4d()) ); CALL_SUBTEST( test_eigen_type(Eigen::MatrixXd(15, 17)) ); CALL_SUBTEST( test_dense_types( Eigen::Array33f(), Eigen::ArrayXd(10), Eigen::MatrixXd(15, 17)) ); } }