codac 2.0.0
Loading...
Searching...
No Matches
codac2_serialize.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <fstream>
13#include "codac2_Vector.h"
14#include "codac2_SampledTraj.h"
15
16namespace codac2
17{
18 // Trivial types (int, float, double...)
19
20 template <typename T>
21 requires (std::is_trivially_copyable_v<T>)
22 void serialize(std::ofstream& f, const T& x)
23 {
24 f.write(reinterpret_cast<const char*>(&x), sizeof(T));
25 }
26
27 template <typename T>
28 requires (std::is_trivially_copyable_v<T>)
29 void deserialize(std::ifstream& f, T& x)
30 {
31 f.read(reinterpret_cast<char*>(&x), sizeof(T));
32 }
33
34 // Vectors and matrices
35
36 template<typename T,int R=-1,int C=-1>
37 void serialize(std::ofstream& f, const Eigen::Matrix<T,R,C>& x)
38 {
39 Index r = x.rows(), c = x.cols();
40 f.write(reinterpret_cast<const char*>(&r), sizeof(Index));
41 f.write(reinterpret_cast<const char*>(&c), sizeof(Index));
42 for(Index i = 0 ; i < r ; i++)
43 for(Index j = 0 ; j < c ; j++)
44 serialize(f,x(i,j));
45 }
46
47 template<typename T,int R=-1,int C=-1>
48 void deserialize(std::ifstream& f, Eigen::Matrix<T,R,C>& x)
49 {
50 Index r, c;
51 f.read(reinterpret_cast<char*>(&r), sizeof(Index));
52 f.read(reinterpret_cast<char*>(&c), sizeof(Index));
53
54 if constexpr(R == -1 && C == -1)
55 x.resize(r,c);
56 else if constexpr(R == -1 || C == -1)
57 x.resize(std::max(r,c));
58 else
59 assert_release(R == r && C == c);
60
61 for(Index i = 0 ; i < r ; i++)
62 for(Index j = 0 ; j < c ; j++)
63 deserialize(f,x(i,j));
64 }
65
66 // SampledTraj<T>
67
68 template <typename T>
69 void serialize(std::ofstream& f, const SampledTraj<T>& x)
70 {
71 Index size = x.nb_samples();
72 f.write(reinterpret_cast<const char*>(&size), sizeof(size));
73
74 for(const auto& [ti, xi] : x)
75 {
76 serialize(f, ti);
77 serialize(f, xi);
78 }
79 }
80
81 template <typename T>
82 void deserialize(std::ifstream& f, SampledTraj<T>& x)
83 {
84 Index size;
85 x.clear();
86 f.read(reinterpret_cast<char*>(&size), sizeof(size));
87
88 for(Index i = 0 ; i < size ; i++)
89 {
90 double ti; deserialize(f,ti);
91 T xi; deserialize(f,xi);
92 x.set(ti,xi);
93 }
94 }
95}