Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
serializer.h
[詳解]
1 //############################################################################
2 /*!
3  @brief TheolizerライブラリのAPI部
4  @details 下記Theolizer(Theolizer Serializer)のAPI定義<br>
5    標準派生Serializer<br>
6    標準Serializableクラス<br>
7  @ingroup TheolizerLib
8  @file serializer.h
9  @author Yoshinori Tahara
10  @date 2016/03/21 Created
11 */
12 /*
13  © 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
14  "Theolizer" is a registered trademark of Theoride Technology.
15 
16  "Theolizer" License
17  In the case where you are in possession of a valid “Theolizer” License,
18  you may use this file in accordance with the terms and conditions of
19  the use license determined by Theoride Technology.
20 
21  General Public License Version 3 ("GPLv3")
22  You may use this file in accordance with the terms and conditions of
23  GPLv3 published by Free Software Foundation.
24  Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
25  A copy of GPLv3 is also saved in a LICENSE.TXT file.
26 
27  商用ライセンス
28  あなたが有効なTheolizer商用ライセンスを保持している場合、
29  セオライド テクノロジーの定める使用許諾書の条件に従って、
30  このファイルを取り扱うことができます。
31 
32  General Public License Version 3(以下GPLv3)
33  Free Software Foundationが公表するGPLv3の使用条件に従って、
34  あなたはこのファイルを取り扱うことができます。
35  GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
36  またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
37 */
38 //############################################################################
39 
40 #if !defined(THEOLIZER_INTERNAL_SERIALIZER_H)
41 #define THEOLIZER_INTERNAL_SERIALIZER_H
42 
43 #include "internal/core.h"
44 
45 //############################################################################
46 // Begin
47 //############################################################################
48 
49 namespace theolizer
50 {
51 
52 //############################################################################
53 // トップ・レベルのシリアライズ/デシリアライズ要求
54 //############################################################################
55 
56 // ***************************************************************************
57 // シリアライズ/デシリアライズ処理
58 // ***************************************************************************
59 
60 //----------------------------------------------------------------------------
61 // シリアライズ/デシリアライズ共用マクロ
62 //----------------------------------------------------------------------------
63 
64 // ---<<< 通常 >>>---
65 
66 //! 通常の保存/回復処理マクロ(@ref Request 参照)
67 #define THEOLIZER_PROCESS(dSerializer, dInstance) \
68  theolizer::internal::process<theolizer::internal::etmDefault,tTheolizerVersion>\
69  (dSerializer, dInstance, #dInstance, THEOLIZER_INTERNAL_FILE, __LINE__)
70 
71 // ---<<< オブジェクト追跡指定 >>>---
72 // 非ポインタ(静的定義領域)の追跡を指定する。
73 // (なお、Theolizerは参照を静的定義領域として取り扱うので注意。)
74 
75 //! 被ポインタ用の保存/回復処理マクロ(@ref Request 参照)
76 #define THEOLIZER_PROCESS_POINTEE(dSerializer, dInstance) \
77  do { \
78  typedef typename std::remove_reference<decltype(dInstance)>::type Type;\
79  static_assert(!std::is_pointer<Type>::value, \
80  "THEOLIZER_PROCESS_POINTEE() does not support a pointer."); \
81  theolizer::internal::process<theolizer::internal::etmPointee,tTheolizerVersion>\
82  (dSerializer, dInstance, #dInstance, THEOLIZER_INTERNAL_FILE, __LINE__);\
83  } while(0)
84 
85 // ---<<< オーナー指定 >>>---
86 // ポインタの指す領域について、このポインタが所有権を持つことを指定する。
87 // デシリアライズ時、nullptrや型が違う場合、
88 // ポイントされている領域を開放し、正しい領域を獲得する。
89 
90 //! オーナ・ポインタ用の保存/回復処理マクロ(@ref Request 参照)
91 #define THEOLIZER_PROCESS_OWNER(dSerializer, dInstance) \
92  do { \
93  typedef typename std::remove_reference<decltype(dInstance)>::type Type;\
94  static_assert(std::is_pointer<typename std::remove_all_extents<Type>::type>::value,\
95  "THEOLIZER_PROCESS_OWNER() support a pointer only."); \
96  theolizer::internal::process<theolizer::internal::etmOwner,tTheolizerVersion>\
97  (dSerializer, dInstance, #dInstance, THEOLIZER_INTERNAL_FILE, __LINE__);\
98  } while(0)
99 
100 // ---<<< 基底クラス(非侵入型手動専用) >>>---
101 
102 //! 非侵入型手動クラスの保存/回復処理で、基底クラスを保存/回復するためのマクロ(@ref WriteManualClass 参照)
103 #define THEOLIZER_PROCESS_BASE(dSerializer, dBase, dInstance) \
104  { \
105  theolizer::internal::BaseSerializer::AutoBaseProcessing \
106  aAutoBaseProcessing(dSerializer); \
107  theolizer::internal::process<theolizer::internal::etmDefault,tTheolizerVersion>\
108  ( \
109  dSerializer, \
110  const_cast<dBase&>(static_cast<dBase const&>(*dInstance)), \
111  "(" #dBase ")", THEOLIZER_INTERNAL_FILE, __LINE__ \
112  ); \
113  }
114 
115 //############################################################################
116 // クラスとenum型のシリアライズ/デシリアライズ定義
117 //############################################################################
118 
119 // ***************************************************************************
120 // クラスのシリアライズ指定
121 // クラス・テンプレートのdClassは<,>問題を避けるため、()で括って渡す。
122 // 通常クラスの場合はその問題がないので()で括らないで渡す。
123 // ***************************************************************************
124 
125 //----------------------------------------------------------------------------
126 // 侵入型(ノーマル)
127 //----------------------------------------------------------------------------
128 
129 // ---<<<< 対応方法=フィールド名) >>>---
130 
131 //! 侵入型半自動クラス(名前対応)指定(@ref HalfAutoClass 参照)
132 #define THEOLIZER_INTRUSIVE(dAnno, dClass, dLastVersionNo) \
133  private: \
134  THEOLIZER_INTERNAL_SERIALIZABLE_AUTO( \
135  THEOLIZER_ANNOTATE(dAnno:), dClass, dClass, dLastVersionNo, \
136  (), theolizer::internal::emName, false, false)
137 
138 // ---<<<< 対応方法=順序) >>>---
139 
140 //! 侵入型半自動クラス(順序対応)指定(@ref HalfAutoClass 参照)
141 #define THEOLIZER_INTRUSIVE_ORDER(dAnno, dClass, dLastVersionNo) \
142  private: \
143  THEOLIZER_INTERNAL_SERIALIZABLE_AUTO( \
144  THEOLIZER_ANNOTATE(dAnno:), dClass, dClass, dLastVersionNo, \
145  (), theolizer::internal::emOrder, false, false)
146 
147 //----------------------------------------------------------------------------
148 // 侵入型(テンプレート)
149 //----------------------------------------------------------------------------
150 
151 #ifndef THEOLIZER_INTERNAL_DOXYGEN
152 
153 // ---<<<< 対応方法=フィールド名) >>>---
154 
155 #define THEOLIZER_INTRUSIVE_TEMPLATE(dAnno, dList, dClass, dLastVersionNo, dUniqueClass)\
156  private: \
157  THEOLIZER_ANNOTATE( \
158  TS:THEOLIZER_INTERNAL_UNPAREN dList;THEOLIZER_INTERNAL_UNPAREN dClass)\
159  THEOLIZER_INTERNAL_SERIALIZABLE_AUTO( \
160  THEOLIZER_ANNOTATE(dAnno:), dClass, dClass, dLastVersionNo, \
161  (friend struct dUniqueClass;), theolizer::internal::emName, false, false)
162 
163 // ---<<<< 対応方法=順序) >>>---
164 
165 #define THEOLIZER_INTRUSIVE_TEMPLATE_ORDER(dAnno, dList, dClass, dLastVersionNo, dUniqueClass)\
166  private: \
167  THEOLIZER_ANNOTATE( \
168  TS:THEOLIZER_INTERNAL_UNPAREN dList;THEOLIZER_INTERNAL_UNPAREN dClass)\
169  THEOLIZER_INTERNAL_SERIALIZABLE_AUTO( \
170  THEOLIZER_ANNOTATE(dAnno:), dClass, dClass, dLastVersionNo, \
171  (friend struct dUniqueClass;), theolizer::internal::emOrder, false, false)
172 
173 #endif // THEOLIZER_INTERNAL_DOXYGEN
174 
175 //----------------------------------------------------------------------------
176 // 非侵入型(手動)
177 //----------------------------------------------------------------------------
178 
179 // ---<<<< 対応方法=順序(ノーマル) >>>---
180 
181 //! 非侵入型手動クラス指定(@ref ManualClass 参照)
182 #define THEOLIZER_NON_INTRUSIVE_ORDER(dClass, dLastVersionNo) \
183  template<> \
184  struct TheolizerNonIntrusive<THEOLIZER_INTERNAL_UNPAREN dClass> : \
185  public THEOLIZER_INTERNAL_UNPAREN dClass \
186  { \
187  THEOLIZER_INTERNAL_SERIALIZABLE_MANUAL(dClass, dLastVersionNo, \
188  (), theolizer::internal::emOrder, true); \
189  }
190 
191 // ---<<<< 対応方法=順序(テンプレート) >>>---
192 
193 #ifndef THEOLIZER_INTERNAL_DOXYGEN
194 
195 #define THEOLIZER_NON_INTRUSIVE_TEMPLATE_ORDER(dList, dClass, dLastVersionNo,dUniqueClass)\
196  THEOLIZER_INTERNAL_UNPAREN dList \
197  struct TheolizerNonIntrusive<THEOLIZER_INTERNAL_UNPAREN dClass> : \
198  public THEOLIZER_INTERNAL_UNPAREN dClass \
199  { \
200  THEOLIZER_ANNOTATE( \
201  TS:THEOLIZER_INTERNAL_UNPAREN dList;THEOLIZER_INTERNAL_UNPAREN dClass)\
202  THEOLIZER_INTERNAL_SERIALIZABLE_MANUAL(dClass, dLastVersionNo, \
203  (friend struct dUniqueClass;), theolizer::internal::emOrder, true);\
204  }
205 
206 #endif // THEOLIZER_INTERNAL_DOXYGEN
207 
208 // ***************************************************************************
209 // enum型のシリアライズ指定
210 // ***************************************************************************
211 
212 //! enum型シリアライズ(シンボル名保存)指定(@ref HalfAutoEnum 参照)
213 #define THEOLIZER_ENUM(dEnum, dLastVersionNo) \
214  THEOLIZER_INTERNAL_ENUM(dEnum, dLastVersionNo, theolizer::internal::estName, false)
215 
216 //! enum型シリアライズ(シンボル値保存)指定(@ref HalfAutoEnum 参照)
217 #define THEOLIZER_ENUM_VALUE(dEnum, dLastVersionNo) \
218  THEOLIZER_INTERNAL_ENUM(dEnum, dLastVersionNo, theolizer::internal::estValue, false)
219 
220 // ***************************************************************************
221 // ポリモーフィズム用派生クラス登録
222 // ***************************************************************************
223 
224 //! ポリモーフィズム用派生クラス登録(@ref Polymorphism31 参照)
225 #define THEOLIZER_REGISTER_CLASS(dClass) \
226  namespace theolizer{namespace internal{ \
227  template \
228  class RegisterToBaseClass<THEOLIZER_INTERNAL_UNPAREN dClass>; \
229  }}
230 
231 // ***************************************************************************
232 // アノテーション用マクロ
233 // ***************************************************************************
234 
235 #ifdef THEOLIZER_INTERNAL_DRIVER
236  #define THEOLIZER_ANNOTATE(...) \
237  __attribute__((annotate("THEORIDE:" THEOLIZER_INTERNAL_STRINGIZE(__VA_ARGS__))))
238 #else
239  /*!
240  @brief アノテーション用マクロ
241  @details @see @ref Basic11
242  @see @ref Basic21
243  @see @ref HowToObjectTracking11
244  @see @ref HowToObjectTracking12
245  @see @ref HowToSpecifySaving133
246  @see @ref ChangingEnum
247  @see @ref HowToModifyEnum1
248  @see @ref HowToModifyEnum31
249  @see @ref HowToModifyClass3
250  @see @ref HowToModifyClass5
251  */
252  #define THEOLIZER_ANNOTATE(...)
253 #endif
254 
255 // ***************************************************************************
256 // クラス・テンプレート対応時のクラス登録
257 // 例えば、std::unique_ptr<>のパラメータであるstd::default_delete<T>
258 // が指定された時(第2パラメータを省略した時)、std::unique_ptr<>クラス名を
259 // ヘッダへ出力する際にstd::default_delete<T>の名前を生成する。
260 // そのためには、std::default_delete<T>が型テーブル(TypeInfoList)へ
261 // 登録されている必要がある。
262 // しかし、std::default_delete<T>はシリアライズ対象ではないため、自動的には
263 // 登録されないため、当マクロを用いて登録する。
264 // ***************************************************************************
265 
266 #ifndef THEOLIZER_INTERNAL_DOXYGEN
267 
268 //----------------------------------------------------------------------------
269 // クラス・テンプレートのパラメータのみのクラス
270 // std::unique_ptr<>のstd::default_delete<T>のように処理は行うが、
271 // データ保持しないようなクラスはシリアライズしない。
272 // そのようなクラスでも名前を取り出せるようにするために登録する。
273 //----------------------------------------------------------------------------
274 
275 // ---<<<< テンプレート >>>---
276 
277 #define THEOLIZER_TEMPLATE_PARAMETER_TEMPLATE(dList, dName, dParam, dUniqueClass)\
278  struct dUniqueClass {}; \
279  THEOLIZER_INTERNAL_UNPAREN dList \
280  struct TheolizerNonIntrusive<dName<THEOLIZER_INTERNAL_UNPAREN dParam> > :\
281  public dName<THEOLIZER_INTERNAL_UNPAREN dParam> \
282  { \
283  THEOLIZER_ANNOTATE( \
284  TS:THEOLIZER_INTERNAL_UNPAREN dList;dName<THEOLIZER_INTERNAL_UNPAREN dParam>)\
285  THEOLIZER_INTERNAL_TEMPLATE_PARAMETER((dName<THEOLIZER_INTERNAL_UNPAREN dParam>),\
286  dName, dParam, dUniqueClass); \
287  }
288 
289 //----------------------------------------------------------------------------
290 // 上記で指定したクラスをテンプレート・パラメータとして持つクラスの
291 // TheolizerUserDefine<>::save/loadClassManual()で登録する。
292 //----------------------------------------------------------------------------
293 
294 #define THEOLIZER_REGISTER_TEMPLATE_PARAMETER(dClass) \
295  theolizer::internal::RegisterType<tMidSerializer,dClass,tTheolizerVersion>::getInstance()
296 
297 #endif // THEOLIZER_INTERNAL_DOXYGEN
298 
299 //############################################################################
300 // オプション機能指定
301 // 保存先
302 // グローバル・バージョン番号
303 //############################################################################
304 
305 // ***************************************************************************
306 // ユーザ用保存先定義マクロ
307 // dPrevSymbol : 定義済保存先の最後を指定する(これに続けて新規シンボルを定義する)
308 // ... : 新規シンボルを1個~8個の範囲で,で区切って指定する
309 // 8個以上定義したい時は、THEOLIZER_DESTINATIONS()を 繰り返し用いる。
310 // dPrevSymbolは直前のTHEOLIZER_DESTINATIONS()で定義した
311 // 最後の新規シンボルを指定する。
312 // ***************************************************************************
313 
314 //! 保存先定義用マクロ
315 #define THEOLIZER_DESTINATIONS(dPrevSymbol, ...) \
316  namespace theolizer{ \
317  namespace internal{namespace{namespace bits{ \
318  enum : unsigned { \
319  THEOLIZER_INTERNAL_CAT(dPrevSymbol, Cont)= \
320  static_cast<unsigned>(theolizerD::dPrevSymbol), \
321  __VA_ARGS__ \
322  }; \
323  }}} /* namespace internal */ \
324  THEOLIZER_INTERNAL_FOR(THEOLIZER_INTERNAL_DESTINATION, __VA_ARGS__);\
325  } /* namespace theolizer */
326 
327 // ***************************************************************************
328 // グローバル・バージョン番号テーブル
329 // ***************************************************************************
330 
331 //----------------------------------------------------------------------------
332 // グローバル・バージョン・テーブル定義マクロ
333 // グローバル名前空間で使用すること
334 //----------------------------------------------------------------------------
335 
336 #ifdef THEOLIZER_WRITE_CODE
337 
338 //! グローバル・バージョン番号テーブル定義用マクロ
339 #define THEOLIZER_DEFINE_GLOBAL_VERSION_TABLE(dName, dLastGlobalVersionNo) \
340  namespace theolizer{namespace internal{namespace global_table{ \
341  class dName final : public internal::GlobalVersionNoTable<dLastGlobalVersionNo>\
342  { \
343  static const unsigned kLastGlobalVersionNo=dLastGlobalVersionNo; \
344  dName(); \
345  public: \
346  static GlobalVersionNoTableBase* getInstance() \
347  { \
348  static dName instance; \
349  return &instance; \
350  } \
351  char const* getTableName() const {return #dName;} \
352  }; \
353  } /* namespace namespace */ \
354  namespace { \
355  GlobalVersionNoTableBase const*const sGlobalVersionNoTable= \
356  global_table::dName::getInstance(); \
357  }} /* namespace internal */ \
358  namespace { \
359  unsigned const kLastGlobalVersionNo=dLastGlobalVersionNo; \
360  }} /* namespace theolizer */
361 #else
362 //! グローバル・バージョン番号テーブル定義用マクロ
363 #define THEOLIZER_DEFINE_GLOBAL_VERSION_TABLE(dName, dLastGlobalVersionNo)
364 #endif
365 
366 #ifndef THEOLIZER_INTERNAL_DOXYGEN
367  #define THEOLIZER_INTERNAL_ADD(dType, ...) add(typeid(::dType),__VA_ARGS__)
368 
369 #endif // THEOLIZER_INTERNAL_DOXYGEN
370 
371 //############################################################################
372 // End
373 //############################################################################
374 
375 } // namespace theolizer
376 
377 #endif // THEOLIZER_INTERNAL_SERIALIZER_H
theolizer名前空間
Definition: base.h:53