MUQ  0.4.3
BoostAnySerializer.h
Go to the documentation of this file.
1 #ifndef BOOSTANYSERIALIZER_H
2 #define BOOSTANYSERIALIZER_H
3 
4 #include "cereal/cereal.hpp"
5 
6 #include "parcer/Eigen.h"
7 #include <boost/any.hpp>
8 #include <cereal/types/string.hpp>
9 
10 #include <typeinfo>
11 #include <string>
12 
13 namespace cereal{
14 
16 {
17  TemporaryBoostAnyConst(boost::any const& anyIn) : any(anyIn) {};
18  boost::any const& any;
19 };
21 {
22  TemporaryBoostAny() = default;
23  TemporaryBoostAny(boost::any& anyIn) : any(anyIn) {};
24  boost::any any;
25 };
26 
27 template<class Archive>
29 {
30 public:
31 
32  // We assume that this function is called after the type name has been read.
33  // Thus, only the object has to be loaded from the archive.
34  template<typename BaseType>
35  static boost::any load(Archive & ar)
36  {
37  BaseType temp;
38  ar(temp);
39  return boost::any(temp);
40  };
41 
42  template<typename BaseType>
43  static void save(boost::any obj, Archive & ar)
44  {
45  // First, save the type name
46  const std::string& typeName = obj.type().name();
47  ar(typeName);
48 
49  // Now, save the object
50  BaseType const& val = boost::any_cast<const BaseType&>(obj);
51  ar(val);
52  };
53 };
54 
58 template<class Archive>
59 void save(Archive & ar, TemporaryBoostAnyConst const& obj)
60 {
61  if(obj.any.type() == typeid(bool)){
62  BoostAnySerializer<Archive>::template save<bool>(obj.any,ar);
63  }else if(obj.any.type() == typeid(double)){
64  BoostAnySerializer<Archive>::template save<double>(obj.any,ar);
65  }else if(obj.any.type() == typeid(float)){
66  BoostAnySerializer<Archive>::template save<float>(obj.any,ar);
67  }else if(obj.any.type() == typeid(std::string)){
68  BoostAnySerializer<Archive>::template save<std::string>(obj.any,ar);
69  }else if(obj.any.type() == typeid(int)){
71  }else if(obj.any.type() == typeid(unsigned int)){
72  BoostAnySerializer<Archive>::template save<unsigned int>(obj.any,ar);
73 
74  }else if(obj.any.type() == typeid(Eigen::Vector2d)){
75  BoostAnySerializer<Archive>::template save<Eigen::Vector2d>(obj.any,ar);
76  }else if(obj.any.type() == typeid(Eigen::Vector3d)){
77  BoostAnySerializer<Archive>::template save<Eigen::Vector3d>(obj.any,ar);
78  }else if(obj.any.type() == typeid(Eigen::Vector4d)){
79  BoostAnySerializer<Archive>::template save<Eigen::Vector4d>(obj.any,ar);
80  }else if(obj.any.type() == typeid(Eigen::VectorXd)){
81  BoostAnySerializer<Archive>::template save<Eigen::VectorXd>(obj.any,ar);
82 
83  }else if(obj.any.type() == typeid(Eigen::Vector2f)){
84  BoostAnySerializer<Archive>::template save<Eigen::Vector2f>(obj.any,ar);
85  }else if(obj.any.type() == typeid(Eigen::Vector3f)){
86  BoostAnySerializer<Archive>::template save<Eigen::Vector3f>(obj.any,ar);
87  }else if(obj.any.type() == typeid(Eigen::Vector4f)){
88  BoostAnySerializer<Archive>::template save<Eigen::Vector4f>(obj.any,ar);
89  }else if(obj.any.type() == typeid(Eigen::VectorXf)){
90  BoostAnySerializer<Archive>::template save<Eigen::VectorXf>(obj.any,ar);
91 
92  }else if(obj.any.type() == typeid(Eigen::Vector2i)){
93  BoostAnySerializer<Archive>::template save<Eigen::Vector2i>(obj.any,ar);
94  }else if(obj.any.type() == typeid(Eigen::Vector3i)){
95  BoostAnySerializer<Archive>::template save<Eigen::Vector3i>(obj.any,ar);
96  }else if(obj.any.type() == typeid(Eigen::Vector4i)){
97  BoostAnySerializer<Archive>::template save<Eigen::Vector4i>(obj.any,ar);
98  }else if(obj.any.type() == typeid(Eigen::VectorXi)){
99  BoostAnySerializer<Archive>::template save<Eigen::VectorXi>(obj.any,ar);
100 
101  }else if(obj.any.type() == typeid(Eigen::Matrix2d)){
102  BoostAnySerializer<Archive>::template save<Eigen::Matrix2d>(obj.any,ar);
103  }else if(obj.any.type() == typeid(Eigen::Matrix3d)){
104  BoostAnySerializer<Archive>::template save<Eigen::Matrix3d>(obj.any,ar);
105  }else if(obj.any.type() == typeid(Eigen::Matrix4d)){
106  BoostAnySerializer<Archive>::template save<Eigen::Matrix4d>(obj.any,ar);
107  }else if(obj.any.type() == typeid(Eigen::MatrixXd)){
108  BoostAnySerializer<Archive>::template save<Eigen::MatrixXd>(obj.any,ar);
109 
110  }else if(obj.any.type() == typeid(Eigen::Matrix2f)){
111  BoostAnySerializer<Archive>::template save<Eigen::Matrix2f>(obj.any,ar);
112  }else if(obj.any.type() == typeid(Eigen::Matrix3f)){
113  BoostAnySerializer<Archive>::template save<Eigen::Matrix3f>(obj.any,ar);
114  }else if(obj.any.type() == typeid(Eigen::Matrix4f)){
115  BoostAnySerializer<Archive>::template save<Eigen::Matrix4f>(obj.any,ar);
116  }else if(obj.any.type() == typeid(Eigen::MatrixXf)){
117  BoostAnySerializer<Archive>::template save<Eigen::MatrixXf>(obj.any,ar);
118 
119  }else if(obj.any.type() == typeid(Eigen::Matrix2i)){
120  BoostAnySerializer<Archive>::template save<Eigen::Matrix2i>(obj.any,ar);
121  }else if(obj.any.type() == typeid(Eigen::Matrix3i)){
122  BoostAnySerializer<Archive>::template save<Eigen::Matrix3i>(obj.any,ar);
123  }else if(obj.any.type() == typeid(Eigen::Matrix4i)){
124  BoostAnySerializer<Archive>::template save<Eigen::Matrix4i>(obj.any,ar);
125  }else if(obj.any.type() == typeid(Eigen::MatrixXi)){
126  BoostAnySerializer<Archive>::template save<Eigen::MatrixXi>(obj.any,ar);
127  }else{
128  std::cout<< "ERROR: Could not interpret type " << obj.any.type().name() << std::endl;
129  assert(false);
130  }
131 };
132 
136 template<class Archive>
137 void load(Archive & ar, boost::any & obj)
138 {
139  // First, read the type
140  std::string typeName;
141  ar(typeName);
142 
143  // Now read the value itself and store in a boost::any
144  if(typeName == typeid(bool).name()){
145  obj = BoostAnySerializer<Archive>::template load<bool>(ar);
146  }else if(typeName == typeid(double).name()){
147  obj = BoostAnySerializer<Archive>::template load<double>(ar);
148  }else if(typeName == typeid(float).name()){
149  obj = BoostAnySerializer<Archive>::template load<float>(ar);
150  }else if(typeName == typeid(std::string).name()){
151  obj = BoostAnySerializer<Archive>::template load<std::string>(ar);
152  }else if(typeName == typeid(int).name()){
153  obj = BoostAnySerializer<Archive>::template load<int>(ar);
154  }else if(typeName == typeid(unsigned int).name()){
155  obj = BoostAnySerializer<Archive>::template load<unsigned int>(ar);
156 
157  }else if(typeName == typeid(Eigen::Vector2d).name()){
158  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector2d>(ar);
159  }else if(typeName == typeid(Eigen::Vector3d).name()){
160  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector3d>(ar);
161  }else if(typeName == typeid(Eigen::Vector4d).name()){
162  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector4d>(ar);
163  }else if(typeName == typeid(Eigen::VectorXd).name()){
164  obj = BoostAnySerializer<Archive>::template load<Eigen::VectorXd>(ar);
165 
166  }else if(typeName == typeid(Eigen::Vector2f).name()){
167  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector2f>(ar);
168  }else if(typeName == typeid(Eigen::Vector3f).name()){
169  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector3f>(ar);
170  }else if(typeName == typeid(Eigen::Vector4f).name()){
171  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector4f>(ar);
172  }else if(typeName == typeid(Eigen::VectorXf).name()){
173  obj = BoostAnySerializer<Archive>::template load<Eigen::VectorXf>(ar);
174 
175  }else if(typeName == typeid(Eigen::Vector2i).name()){
176  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector2i>(ar);
177  }else if(typeName == typeid(Eigen::Vector3i).name()){
178  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector3i>(ar);
179  }else if(typeName == typeid(Eigen::Vector4i).name()){
180  obj = BoostAnySerializer<Archive>::template load<Eigen::Vector4i>(ar);
181  }else if(typeName == typeid(Eigen::VectorXi).name()){
182  obj = BoostAnySerializer<Archive>::template load<Eigen::VectorXi>(ar);
183 
184  }else if(typeName == typeid(Eigen::Matrix2d).name()){
185  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix2d>(ar);
186  }else if(typeName == typeid(Eigen::Matrix3d).name()){
187  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix3d>(ar);
188  }else if(typeName == typeid(Eigen::Matrix4d).name()){
189  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix4d>(ar);
190  }else if(typeName == typeid(Eigen::MatrixXd).name()){
191  obj = BoostAnySerializer<Archive>::template load<Eigen::MatrixXd>(ar);
192 
193  }else if(typeName == typeid(Eigen::Matrix2f).name()){
194  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix2f>(ar);
195  }else if(typeName == typeid(Eigen::Matrix3f).name()){
196  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix3f>(ar);
197  }else if(typeName == typeid(Eigen::Matrix4f).name()){
198  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix4f>(ar);
199  }else if(typeName == typeid(Eigen::MatrixXf).name()){
200  obj = BoostAnySerializer<Archive>::template load<Eigen::MatrixXf>(ar);
201 
202  }else if(typeName == typeid(Eigen::Matrix2i).name()){
203  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix2i>(ar);
204  }else if(typeName == typeid(Eigen::Matrix3i).name()){
205  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix3i>(ar);
206  }else if(typeName == typeid(Eigen::Matrix4i).name()){
207  obj = BoostAnySerializer<Archive>::template load<Eigen::Matrix4i>(ar);
208  }else if(typeName == typeid(Eigen::MatrixXi).name()){
209  obj = BoostAnySerializer<Archive>::template load<Eigen::MatrixXi>(ar);
210  }else{
211  assert(false);
212  }
213 }
214 
215 } // namespace cereal
216 
217 #endif
static boost::any load(Archive &ar)
static void save(boost::any obj, Archive &ar)
void save(Archive &ar, TemporaryBoostAnyConst const &obj)
void load(Archive &ar, boost::any &obj)
TemporaryBoostAnyConst(boost::any const &anyIn)
TemporaryBoostAny(boost::any &anyIn)