REC RPC library
rec_rpc_serialization_Complex.h
Go to the documentation of this file.
1 /*
2 Copyright (c) 2011, REC Robotics Equipment Corporation GmbH, Planegg, Germany
3 All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
7 
8 - Redistributions of source code must retain the above copyright notice,
9  this list of conditions and the following disclaimer.
10 - Redistributions in binary form must reproduce the above copyright notice,
11  this list of conditions and the following disclaimer in the documentation and/or
12  other materials provided with the distribution.
13 - Neither the name of the REC Robotics Equipment Corporation GmbH nor the names of
14  its contributors may be used to endorse or promote products derived from this software
15  without specific prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
18 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
23 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
24 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26 
27 #ifndef _REC_RPC_SERIALIZATION_COMPLEX_H_
28 #define _REC_RPC_SERIALIZATION_COMPLEX_H_
29 
31 #include "rec/rpc/defines.h"
32 
33 #include <QDataStream>
34 #include <QList>
35 
36 namespace rec
37 {
38  namespace rpc
39  {
40  namespace serialization
41  {
58  {
59  public:
61  Complex( const QString& versionString );
62  virtual ~Complex();
63 
64  protected:
73  void addChild( Serializable* c );
74 
75  private:
76  void serialize( QDataStream& ) const;
77  void deserialize( QDataStream& );
78 
79  const QString _versionString;
80  QList< Serializable* > _children;
81  };
82  }
83  }
84 }
85 
99 #define BEGIN_COMPLEX_DATA_DECLARATION( TYPENAME ) \
100  class TYPENAME; \
101  typedef QSharedPointer< TYPENAME > TYPENAME##Ptr; \
102  typedef QSharedPointer< const TYPENAME > TYPENAME##PtrConst; \
103  class TYPENAME : public rec::rpc::serialization::Complex \
104  { \
105  public: \
106  TYPENAME();
107 
113 #define END_COMPLEX_DATA_DECLARATION };
114 
126 #define BEGIN_COMPLEX_DATA_IMPLEMENTATION( TYPENAME, VERSION ) \
127  TYPENAME::TYPENAME() \
128  : rec::rpc::serialization::Complex( #TYPENAME "_" #VERSION ) \
129  {
130 
136 #define END_COMPLEX_DATA_IMPLEMENTATION }
137 
154 #define BEGIN_COMPLEX_DATA_DECLARATION_AND_IMPLEMENTATION( TYPENAME, VERSION ) \
155  class TYPENAME; \
156  typedef QSharedPointer< TYPENAME > TYPENAME##Ptr; \
157  typedef QSharedPointer< const TYPENAME > TYPENAME##PtrConst; \
158  class TYPENAME : public rec::rpc::serialization::Complex \
159  { \
160  public: \
161  TYPENAME() \
162  : rec::rpc::serialization::Complex( #TYPENAME "_" #VERSION ) \
163  {
164 
173 #define END_COMPLEX_DATA_DECLARATION_AND_IMPLEMENTATION_CONSTRUCTOR }
174 
180 #define END_COMPLEX_DATA_DECLARATION_AND_IMPLEMENTATION };
181 
190 #define USE_COMPLEX_DATA( EXISTINGTYPENAME, NEWTYPENAME ) \
191  typedef EXISTINGTYPENAME NEWTYPENAME; \
192  typedef QSharedPointer< NEWTYPENAME > NEWTYPENAME##Ptr; \
193  typedef QSharedPointer< const NEWTYPENAME > NEWTYPENAME##PtrConst;
194 
203 #define USE_COMPLEX_DATA_AS_PARAM( TYPENAME, FUNCTIONNAME ) USE_COMPLEX_DATA( TYPENAME, FUNCTIONNAME##Param )
204 
213 #define USE_COMPLEX_DATA_AS_RESULT( TYPENAME, FUNCTIONNAME ) USE_COMPLEX_DATA( TYPENAME, FUNCTIONNAME##Result )
214 
223 #define USE_COMPLEX_DATA_AS_TOPICDATA( TYPENAME, TOPICNAME ) USE_COMPLEX_DATA( TYPENAME, topic##TOPICNAME##Data )
224 
236 #define DECLARE_CUSTOM_MEMBER( DATATYPE, NAME ) \
237  private: \
238  QSharedPointer< DATATYPE > _##NAME; \
239  void create_##NAME() { _##NAME = QSharedPointer< DATATYPE >( new DATATYPE ); } \
240  public: \
241  DATATYPE& NAME() { return *_##NAME; } \
242  const DATATYPE& NAME() const { return *_##NAME; } \
243  void set##NAME( const DATATYPE& pos ) { *_##NAME = pos; }
244 
252 #define ADD_MEMBER( NAME ) \
253  create_##NAME(); \
254  addChild( _##NAME.data() );
255 
256 #endif //_REC_RPC_SERIALIZATION_COMPLEX_H_
#define REC_RPC_EXPORT
Definition: defines.h:49
Base class for complex serializable data containers.