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
theolizer名前空間
Definition:
base.h:53
Theolizer
source
library
theolizer
serializer.h
© 2016
Theoride Technology
All Rights Reserved. "Theolizer" is a registered trademark of Theoride Technology.
構築:
1.8.12