MIRA
Serialization.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Contact: info@mira-project.org
9  *
10  * Commercial Usage:
11  * Licensees holding valid commercial licenses may use this file in
12  * accordance with the commercial license agreement provided with the
13  * software or, alternatively, in accordance with the terms contained in
14  * a written agreement between you and MLAB or NICR.
15  *
16  * GNU General Public License Usage:
17  * Alternatively, this file may be used under the terms of the GNU
18  * General Public License version 3.0 as published by the Free Software
19  * Foundation and appearing in the file LICENSE.GPL3 included in the
20  * packaging of this file. Please review the following information to
21  * ensure the GNU General Public License version 3.0 requirements will be
22  * met: http://www.gnu.org/copyleft/gpl.html.
23  * Alternatively you may (at your option) use any later version of the GNU
24  * General Public License if such license has been publicly approved by
25  * MLAB and NICR (or its successors, if any).
26  *
27  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
28  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
29  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
30  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
33  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
34  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
35  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
36  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
37  */
38 
48 #ifndef _MIRA_SERIALIZATION_H_
49 #define _MIRA_SERIALIZATION_H_
50 
56 #include <serialization/Print.h>
57 
58 #include <factory/Factory.h>
59 
60 #include <utils/Registrar.h>
61 #include <utils/PParam.h>
62 
63 namespace mira {
64 
66 
68 
71 template<typename Serializer, typename T>
72 class SerializerClassTypeRegisterer
73 {
74 public:
75  SerializerClassTypeRegisterer()
76  {
77  // register the class T in the Serializer
78  Serializer::template registerClass<T>();
79  }
80 
81  ~SerializerClassTypeRegisterer()
82  {
83  // register the class T in the Serializer
84  Serializer::template unregisterClass<T>();
85  }
86 };
87 
88 #define MIRA_CURRENT_SERIALIZER_SEQUENCE \
89  (mira::XMLSerializer) \
90  (mira::XMLDeserializer) \
91  (mira::JSONSerializer) \
92  (mira::JSONDeserializer) \
93  (mira::BinaryBufferSerializer) \
94  (mira::BinaryBufferDeserializer) \
95  (mira::BinaryStreamSerializer) \
96  (mira::BufferedBinaryStreamSerializer) \
97  (mira::BinaryStreamDeserializer) \
98  (mira::PropertySerializer) \
99  (mira::MetaSerializer)
100 
101 #define MIRA_LEGACY_SERIALIZER_SEQUENCE \
102  (mira::BinaryBufferSerializerLegacy) \
103  (mira::BinaryBufferDeserializerLegacy) \
104  (mira::BinaryBufferDeserializerLegacyMarked) \
105  (mira::BinaryStreamSerializerLegacy) \
106  (mira::BinaryStreamDeserializerLegacy) \
107  (mira::BinaryStreamDeserializerLegacyMarked)
108 
109 #ifdef MIRA_REGISTER_LEGACY_SERIALIZERS
110 #define MIRA_SERIALIZER_SEQUENCE \
111  MIRA_CURRENT_SERIALIZER_SEQUENCE \
112  MIRA_LEGACY_SERIALIZER_SEQUENCE
113 #else
114 #define MIRA_SERIALIZER_SEQUENCE \
115  MIRA_CURRENT_SERIALIZER_SEQUENCE
116 #endif
117 
118 #define MIRA_CLASS_SERIALIZATION_IMPL(r, Class, Serializer) \
119  MIRA_REGISTRAR(MIRA_PPARAM(mira::SerializerClassTypeRegisterer<Serializer, Class>)) \
120 
121 
139 #define MIRA_CLASS_SERIALIZATION( pCLASS, ... ) \
140  MIRA_CLASS_REGISTER( pCLASS, __VA_ARGS__ ) \
141  BOOST_PP_SEQ_FOR_EACH( MIRA_CLASS_SERIALIZATION_IMPL, pCLASS, MIRA_SERIALIZER_SEQUENCE )
142 
144 #define MIRA_INTERNAL_TEMPLATE_CLASS_SERIALIZATION_IMPL(r, Args, i, Serializer) \
145  /* Args(0) - current template specialization */ \
146  /* Args(1) - number of template parameters */ \
147  /* Args(2) - The class */ \
148  /* Args(3-n) - The namespace */ \
149  MIRA_REGISTRAR(MIRA_PPARAM(mira::SerializerClassTypeRegisterer<Serializer, \
150  MIRA_INTERNAL_CONC_NAMESPACE(Args,3)BOOST_PP_SEQ_ELEM(2,Args)<BOOST_PP_TUPLE_REM_CTOR( BOOST_PP_SEQ_ELEM(1,Args), BOOST_PP_SEQ_ELEM(0,Args))> >))\
151 
152 
153 #define MIRA_INTERNAL_TEMPLATE_CLASS_SERIALIZATION(r, Args, TmplSpec) \
154  /* Args(0) - number of template parameters */ \
155  /* Args(1) - The class */ \
156  /* Args(2-n) - The namespace */ \
157  BOOST_PP_SEQ_FOR_EACH_I(MIRA_INTERNAL_TEMPLATE_CLASS_SERIALIZATION_IMPL, \
158  (TmplSpec)Args, MIRA_SERIALIZER_SEQUENCE)
159 
161 
170 #define MIRA_TEMPLATE_CLASS_SERIALIZATION(Namespace, Class, TmplSpec, ... ) \
171  MIRA_TEMPLATE_CLASS_REGISTER(Namespace, Class, TmplSpec, __VA_ARGS__ ) \
172  BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_TEMPLATE_CLASS_SERIALIZATION, (1)(Class)Namespace,MIRA_MAKE_SEQ(1,TmplSpec))
173 
182 #define MIRA_VARTEMPLATE_CLASS_SERIALIZATION(Namespace, Class, NumTmplPrm, TmplSpec, ... ) \
183  MIRA_VARTEMPLATE_CLASS_REGISTER(Namespace, Class, NumTmplPrm, \
184  TmplSpec, __VA_ARGS__ ) \
185  BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_TEMPLATE_CLASS_SERIALIZATION, \
186  (NumTmplPrm)(Class)Namespace, \
187  MIRA_MAKE_SEQ(NumTmplPrm,TmplSpec))
188 
190 
191 } // namespace
192 
193 #endif
Registration and unregistration helper class.
Preprocessor workaround to handle single parameters that contain a comma.
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
$Header file containing base classes to enable class creation using a class factory$ ...
Binary serializer and deserializer.
Serializer that handles properties and creates PropertyNodes.
Serializer for creating meta information out of types using serialization.
XMLSerializer and XMLDeserializer.
Serializer and Deserializer for JSON format.