Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
7a.class_variation.h
[詳解]
1 //############################################################################
2 /*!
3  @brief ドキュメント・ファイル-使用方法(個別)
4  @ingroup Documents
5  @file 7a.class_variation.h
6  @author Yoshinori Tahara
7  @date 2016/12/02 Created
8 */
9 /*
10  © 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
11  "Theolizer" is a registered trademark of Theoride Technology.
12 
13  "Theolizer" License
14  In the case where you are in possession of a valid “Theolizer” License,
15  you may use this file in accordance with the terms and conditions of
16  the use license determined by Theoride Technology.
17 
18  General Public License Version 3 ("GPLv3")
19  You may use this file in accordance with the terms and conditions of
20  GPLv3 published by Free Software Foundation.
21  Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
22  A copy of GPLv3 is also saved in a LICENSE.TXT file.
23 
24  商用ライセンス
25  あなたが有効なTheolizer商用ライセンスを保持している場合、
26  セオライド テクノロジーの定める使用許諾書の条件に従って、
27  このファイルを取り扱うことができます。
28 
29  General Public License Version 3(以下GPLv3)
30  Free Software Foundationが公表するGPLv3の使用条件に従って、
31  あなたはこのファイルを取り扱うことができます。
32  GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
33  またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
34 */
35 //############################################################################
36 
37 /*!
38  @page ClassVariation クラスのバリエーション
39 ここでは、クラス(classとstruct)をシリアライズする時の様々なバリエーションについて説明します。
40 
41 <br>
42 //############################################################################
43 @section FullAutoClass 1.非侵入型完全自動クラス
44 //############################################################################
45 
46 これはシリアライズするためにクラス定義への前準備が不要な使い方です。<br>
47 使用している他のライブラリの「構造体」をシリアライズしたい時、および、プロトタイピングやデバッグ中に一時的にシリアライズしたい時に用います。<br>
48 
49 使い方は簡単で、シリアライズしたい構造体のインスタンスをいきなりTHEOLIZER_PROCESS()マクロに与えるだけです。
50 
51 <b>定義例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
52 非侵入型完全自動クラスの定義例です。
53 
54 @dontinclude basic/test_class_variation.h
55 @skip FullAutoTutorial
56 @until };
57 
58 <b>保存処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
59 上記のFullAutoTutorialを保存するコード例です。
60 
61 @dontinclude basic/test_class_variation.cpp
62 @skip void tutoriseClassVariation()
63 @skip "tutoriseClassVariation() start"
64 @skip {
65 @until THEOLIZER_PROCESS
66 @skip }
67 @until }
68 
69 <b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
70 上記で保存されたシリアライズ・データの該当部分です。<br>
71 このファイルは、<b>zy2_long_test.sh</b>や<b>zz2_long_test.bat</b> にて自動生成されます。(「@ref HowToBuildLibrary13 」参照。)本節のビルド・フォルダ配下のファイルは全て同じです。<br>
72 privateメンバ以外のメンバが保存されています。
73 @code
74 {
75  "mFullAutoProtected":456,
76  "mFullAutoPublic":789
77 }
78 @endcode
79 
80 <b>回復処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
81 上記のFullAutoTutorialを回復して値をチェックするコード例です。
82 
83 @skip {
84 @until THEOLIZER_EQUAL
85 @skip }
86 @until }
87 
88 Theolizerドライバがシリアライズされていることを検出し、自動的に必要なメンバ・リストを生成して、シリアライズ可能な状態にします。<br>
89 privateメンバをシリアライズするためには、対象構造体の内部にシリアライズ関数を設ける必要が有ります。
90 それを自動的に行うと問題が多発してしまいます。(例えば「他のライブラリ」のソースを変更してしまう。)<br>
91 それは行うべきではありませんので完全自動クラスを「非侵入型」として実装しました。従って、privateメンバをシリアライズすることはできません。<br>
92 なお、対象クラスを派生して派生先クラスでシリアライズ関数を実装しているため、protectedメンバはシリアライズします。
93 
94 各メンバに対して保存の有無、および、保存先の指定が可能です。「@ref Destinations 」を参照下さい。<br>
95 <br>
96 //############################################################################
97 @section HalfAutoClass 2.侵入型半自動クラス
98 //############################################################################
99 
100 これはシリアライズするためにクラス定義への前準備が必要ですが、クラス定義のバージョン管理が可能になる使い方です。(バージョン管理については「@ref ChangingClass 」を参照下さい。)<br>
101 
102 クラス定義のバージョン管理が不要な間は原則として使う必要はありません。<br>
103 例外は下記です。
104  - privateメンバもシリアライズしたい時
105  - メンバ変数を「順序対応」にしたい時
106 
107 「@ref Basic121 」で説明したように、シリアライズ・データとプログラム間でメンバ変数を対応する方法として2種類サポートしています。
108 
109 <b>名前対応の定義例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
110 侵入型半自動クラスを「名前対応」で定義する時はTHEOLIZER_INTRUSIVE()マクロを使います。
111 
112 @dontinclude basic/test_class_variation.h
113 @skip HalfAutoNameTutorial
114 @until };
115 
116 <b>順序対応の定義例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
117 侵入型半自動クラスを「名前対応」で定義する時はTHEOLIZER_INTRUSIVE_ORDER()マクロを使います。
118 
119 @skip HalfAutoOrderTutorial
120 @until };
121 
122 THEOLIZER_INTRUSIVE()とTHEOLIZER_INTRUSIVE_ORDER()は、最後に<b>private:</b> で終わっています。ですので、クラス定義の最後に置くことをお勧めします。
123 
124 これらのマクロは次のように使います。
125 
126  - <b>THEOLIZER_INTRUSIVE(dAnno, dClass, dLastVersionNo);</b>
127  - <b>THEOLIZER_INTRUSIVE_ORDER(dAnno, dClass, dLastVersionNo);</b>
128 
129 それぞれのパラメータは以下の通りです。
130 
131  - <b>dAnno</b><br>
132  メンバ保存の指定方法のオプションです。詳しくは「@ref Destinations 」を参照下さい。<br>
133  - CS : デフォルトで保存します。(通常はこちらを指定して下さい。)<br>
134  - CN : デフォルトは保存しません。(保存するメンバを指定します)<br>
135  - <b>dClass</b><br>
136  自クラス名を指定します。C++はメンバ関数の外クラス定義内で自クラスにアクセスできないため、指定が必要なのです。クラス名の外側に必ず()を付けて下さい。<br>
137  - <b>dLastVersionNo</b><br>
138  最新版のローカル・バージョン番号を指定します。最初は1を指定して下さい。<br>
139  「@ref ChangingClass 」で使い方を説明します。<br>
140 <br>
141 
142 <b>保存処理/回復処理</b>は非侵入型完全自動と同じですので、省略します。
143 
144 <b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
145 保存されたシリアライズ・データの該当部分です。<br>
146 privateメンバも含めて保存されています。
147 @code
148 {
149  "mHalfAutoNamePrivate":-123,
150  "mHalfAutoNameProtected":-456,
151  "mHalfAutoNamePublic":-789
152 }
153 @endcode
154 
155 <br>
156 //############################################################################
157 @section ManualClass 3.非侵入型手動クラス
158 //############################################################################
159 
160 これは自動でシリアライズすることが困難なクラスに対応するために設けました。<br>
161 例えば、std::vector<>を自動的に適切なシリアライズをすることは現実的ではありません。そのような場合に保存/回復処理を手動で記述するための仕組みです。<br>
162 使い方が難しいため、どうしても必要な時だけお使い下さい。(クラス・テンプレートにも対応しているのですが、使い方の難易度が高いこと、および、十分なテストを行うには時間が掛かりそうですので、現時点ではクラス・テンプレート対応は非公開と致します。)
163 
164 下記の手順で保存/回復処理を記述することを推奨します。<br>
165 
166 1. @link DefineManualClass プロジェクトをビルド・エラーがでない状態にして下さい。@endlink<br>
167  シリアライズ対象クラスの定義を行って下さい。そして、ビルド・エラーをなくすことをお勧めします。<br>
168 <br>
169 
170 2. @link SpecifyManualClass 対象とするクラスをTHEOLIZER_NON_INTRUSIVE_ORDER()マクロで指定します。@endlink<br>
171 <br>
172 
173 3. @link TemplateManualClass 一度ビルドします。この時、未定義エラーが出ます。@endlink<br>
174  TheolizerNonIntrusive<対象クラス名>::%TheolizerUserDefine を含むエラーになります。<br>
175  この部分はテンプレートを使っていることもあり、あまり適切なエラー・メッセージになりません。たいへん申し訳ないですが、注意深くご使用下さい。<br>
176 <br>
177 
178 4. @link CopyManualClass 自動生成されたソース内にある未定義エラーのクラス定義雛形をコピーします。@endlink<br>
179  これは保存/回復処理の記述先関数の枠組み定義です。<br>
180  これをTHEOLIZER_NON_INTRUSIVE_ORDER()マクロの直後へコピーして下さい。<br>
181 <br>
182 
183 5. @link WriteManualClass 上記のクラス内に保存/回復処理を記述して下さい。@endlink<br>
184 <br>
185 
186 6. @link SaveLoadManualClass 後は通常通りTHEOLIZER_PROCESS()シリーズ・マクロでシリアライズ処理します。@endlink<br>
187 
188 @subsection DefineManualClass 3-1.非侵入型手動クラスの定義例
189 サンプル・ソースは source/reference_and_test/basic/test_class_variation.h です。<br>
190 非侵入型手動クラスの定義例です。
191 
192 @skip ManualTutorial
193 @until };
194 
195 @subsection SpecifyManualClass 3-2.非侵入型手動クラスのシリアライズ指定
196 サンプルですのでクラス定義に続けてシリアライズ指定していますが、実際にはシリアライズ指定はクラス定義より後であれば離れていてもよいです。
197 
198 @skip ManualTutorial
199 @until THEOLIZER_NON_INTRUSIVE_ORDER
200 
201 THEOLIZER_NON_INTRUSIVE_ORDER()マクロは次のように使います。
202 
203  - <b>THEOLIZER_NON_INTRUSIVE_ORDER(dClass, dLastVersionNo);</b><br>
204  手動型は順序対応のみです。<br>
205 
206 パラメータは以下の通りです。
207 
208  - <b>dClass</b><br>
209  対象クラス名を指定します。クラス名の外側に必ず()を付けて下さい。<br>
210  - <b>dLastVersionNo</b><br>
211  最新版のバージョン番号は指定します。最初は1を指定して下さい。<br>
212  「@ref ChangingClass 」で使い方を説明します。<br>
213 <br>
214 
215 @subsection TemplateManualClass 3-3.自動生成される保存/回復処理用関数の雛形例
216 サンプルは `<ビルド・フォルダ>/reference_and_test/basic/test_class_variation.cpp.theolizer.hpp` に生成されます。<br>
217 ManualTutorialクラスに対する部分は下記です。<br>
218 
219 @code
220 #ifdef THEOLIZER_WRITE_CODE // ###### ManualTutorial ######
221 
222 #if false // Sample of save/load function.
223 template<class tBaseSerializer, class tTheolizerVersion>
224 struct TheolizerNonIntrusive<ManualTutorial>::TheolizerUserDefine<tBaseSerializer, tTheolizerVersion, 1>
225 {
226  // Save members.
227  static void saveClassManual
228  (
229  tBaseSerializer& iSerializer,
230  typename tTheolizerVersion::TheolizerTarget const*const& iInstance
231  )
232  {
233 
234 
235  }
236 
237  // Load members.
238  static void loadClassManual
239  (
240  tBaseSerializer& iSerializer,
241  typename tTheolizerVersion::TheolizerTarget*& oInstance
242  )
243  {
244  if (!oInstance) oInstance=new typename tTheolizerVersion::TheolizerTarget();
245 
246 
247  }
248 };
249 #endif // Sample of save/load function.
250 
251 #define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1)
252 #define THEOLIZER_GENERATED_CLASS_TYPE ManualTutorial
253 
254 // ---<<< Version.1 >>>---
255 
256 #define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1)
257 #define THEOLIZER_GENERATED_CLASS_NAME()\
258  THEOLIZER_INTERNAL_CLASS_NAME((u8"ManualTutorial"))
259 #include <theolizer/internal/version_manual.inc>
260 #undef THEOLIZER_GENERATED_VERSION_NO
261 
262 #endif//THEOLIZER_WRITE_CODE // ###### ManualTutorial ######
263 @endcode
264 
265 @subsection CopyManualClass 3-4.クラス定義雛形のコピー
266 上記雛形の <b>#%if false // Sample of save/load function.</b> の次の行から、 <b>#%endif // Sample of save/load function.</b> の前の行までを、THEOLIZER_NON_INTRUSIVE_ORDER((ManualTutorial), 1);の直後へコピーします。
267 
268 @subsection WriteManualClass 3-5.保存/回復処理関数の記述
269 雛形をコピーしたsave/load関数にトップ・レベルと同じく下記マクロ群を用いて、必要な情報を保存/回復します。<br>
270 
271 - THEOLIZER_PROCESS
272 - THEOLIZER_PROCESS_POINTEE
273 - THEOLIZER_PROCESS_OWNER
274 
275 また、非侵入型手動専用のシリアライズ・マクロがあります。
276 
277 - THEOLIZER_PROCESS_BASE
278 
279 <b>THEOLIZER_PROCESS_BASE(dSerializer, dBase, dInstance)</b>
280  - dSerializer : シリアライザのインスタンスを指定します。<br>
281  - dBase : 保存/回復する基底クラスをクラス名で指定します。<br>
282  - dInstance : 保存/回復するインスタンスを指定します。<br>
283 
284 保存/回復処理のサンプルです。
285 
286 @dontinclude basic/test_class_variation.h
287 @skip ManualTutorial
288 @skip <<<
289 @until };
290 
291 <b>tTheolizerVersion::TheolizerTarget</b> は、指定した対象クラス型へ展開されます。<br>
292 この例ではManualTutorialです。constや参照がついていて分かりにくいですが、意味的には下記となります。
293 
294  - saveClassManual() 関数の<b>iInstance</b> : ManualTutorialへのポインタ
295  - loadClassManual() 関数の<b>oInstance</b> : ManualTutorialへのポインタへの参照
296 
297 oInstanceにnullptrが設定されていた場合は、領域を獲得して下さい。<br>
298 その際、一部の回復処理を先に行い、その値を使ってコンストラクタしてポインタを返却するため、ポインタへの参照にしています。
299 
300 @subsection SaveLoadManualClass 3-6.保存/回復処理例
301 
302 <b>保存処理/回復処理</b>は非侵入型完全自動と同じですので、省略します。
303 
304 <b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
305 保存されたシリアライズ・データの該当部分です。<br>
306 順序対応なのでメンバ変数名は出力されません。mManualPublicに100を設定して保存していますので、100のみが出力されます。
307 @code
308 [
309  100
310 ]
311 @endcode
312 
313 <br>
314 //############################################################################
315 @section DerivedIncluded 4.それらを派生したり包含したりしたクラス
316 //############################################################################
317 各種クラスの派生、および、包含(メンバ変数として他のクラス型を用いる)は、通常通りです。
318 
319 <b>各種クラスを派生/包含した例</b> (source/reference_and_test/basic/test_class_variation.h)<br>
320 FullAutoTutorialをpublic継承、HalfAutoNameTutorialをprivate継承、HalfAutoOrderTutorialをprivateメンバ、ManualTutorialをpublicメンバとした非侵入型完全自動クラスです。<br>
321 protectedを定義していませんが、protected継承、protectedメンバの両方とも使えます。
322 
323 @skip DerivedClass
324 @until };
325 
326 <b>保存処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
327 上記のDerivedClassを保存するコード例です。
328 
329 @dontinclude basic/test_class_variation.cpp
330 @skip void tutoriseClassVariation()
331 @skip "tutoriseClassVariation() start"
332 @skip {
333 @until JsonOSerializer
334 @skip 派生/包含クラス
335 @until }
336 
337 <b>保存結果</b> (`<ビルド・フォルダ>/Testing/tutorise_class_variation.json`)<br>
338 上記で保存されたシリアライズ・データの該当部分です。<br>
339 名前対応ですので、基底クラスの定義順序変更に備え基底クラスは()付きでクラス名で保存しています。<br>
340 非侵入型ですのでprivate継承したクラス、およひ、privateメンバは保存されません。
341 
342 @code
343 {
344  "(FullAutoTutorial)":{
345  "mFullAutoProtected":201,
346  "mFullAutoPublic":202
347  },
348  "mManualTutorial":[
349  207
350  ]
351 }
352 @endcode
353 
354 <b>回復処理例</b> (source/reference_and_test/basic/test_class_variation.cpp の <b>tutoriseClassVariation()</b> 関数)<br>
355 上記のFullAutoTutorialを回復して値をチェックするコード例です。
356 
357 @skip {
358 @until JsonISerializer
359 @skip 派生/包含クラス
360 @until }
361 
362 private継承したクラス、およひ、privateメンバは保存されないため、デフォルト・コンストラクタで生成された値(0)のまま変化しませんので、0と一致することを確認しています。
363 
364 <br>
365 //############################################################################
366 @section TestClassVariation 5.網羅的な使用例(自動テスト)の説明
367 //############################################################################
368 
369 網羅的な自動テスト用のクラスは<b>source/reference_and_test/basic/test_class_variation.h</b> ファイルの「単独テスト」以降で定義しています。<br>
370 また、テスト処理は<b>source/reference_and_test/basic/test_class_variation.cpp</b> ファイルで定義しており、saveClassVariation()関数で保存処理、loadClassVariation()関数で回復処理と値の検証を行っています。
371 
372 @subsection SingleTest 5-1.単独テスト
373 単独テストの先頭で<b>DEFINE_MEMBERS()マクロ</b>を定義しています。<br>
374 
375 これは、全てのプリミティブ型、幾つかの基本的なenum型とクラスについて、単独、および、配列を定義するためのマクロです。このマクロを展開する直前でDEFINE()とARRAY()マクロを定義することで各々について、メンバ変数の定義、初期化、保存、回復、値チェックするコードを生成しています。
376 
377 @dontinclude basic/test_class_variation.h
378 @skip DEFINE_MEMBERS
379 @until ARRAY(ClassBasicTest
380 @until ClassBasicTest()
381 
382 単独テストの内容は、以下の通りです。
383 
384 1. 「@ref BasicProcess 」の網羅テストと同じプリミティブとenum型、クラス、配列のセットの定義<br>
385  多数用いるのでDEFINE_MEMBERS()マクロで定義しています。<br>
386 <br>
387 
388 2. 非侵入型完全自動クラス(FullAuto)<br>
389  DEFINE_MEMBERS()マクロのメンバについて、private, protected, publicのそれぞれに定義しています。<br>
390  ArrayOnly0(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
391  privateメンバ以外は保存/回復でき、privateメンバは初期値が維持されることを検証しています。<br>
392 <br>
393 
394 3. 侵入型半自動-名前対応クラス(HalfAutoName)<br>
395  DEFINE_MEMBERS()マクロのメンバについて、private, protected, publicのそれぞれに定義しています。<br>
396  ArrayOnly1(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
397  全てのメンバが保存/回復できることを検証しています。<br>
398 <br>
399 
400 4. 侵入型半自動-順序対応クラス(HalfAutoorder)<br>
401  DEFINE_MEMBERS()マクロのメンバについて、private, protected, publicのそれぞれに定義しています。<br>
402  ArrayOnly2(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
403  全てのメンバが保存/回復できることを検証しています。<br>
404 <br>
405 
406 5. 非侵入型手動クラス(Manual)<br>
407  DEFINE_MEMBERS()マクロのメンバについて、public定義しています。<br>
408  ArrayOnly3(非侵入型完全自動クラス)クラスの配列メンバをpublicとして定義しています。<br>
409  全てのメンバの保存/回復処理を実装しています。<br>
410  全てのメンバが保存/回復できることを検証しています。<br>
411  (非侵入型手動クラスで、private/protectedメンバをシリアライズするコードを記述するとコンパイルできないため、これらのメンバの実装とシリアライズ・テストは行なっていません。)
412 
413 <br>
414 
415 <b>ArrayOnly</b>について<br>
416 他のクラスメンバに配列としてのみ使用される非侵入型完全自動クラスのソース自動生成に不具合が発生したため、その再発防止用として実装しています。<br>
417 
418 @subsection DoubleTest 5-2.二重組み合わせテスト
419 
420 @subsubsection DoubleTestHelper 5-2-1.二重組み合わせテスト用のヘルパー・クラス
421 非侵入型完全自動(BaseFullAuto)、侵入型半自動(BaseHalfAuto)、非侵入型手動(BaseManual)のクラス・テンプレートを定義しています。<br>
422 これらは全てテンプレート・パラメータとしてint型の非型パラメータを1つ持ち、メンバ変数の初期値を決めてます。<br>
423 
424 これらのBaseXxxクラス群を派生したクラスは更に別のクラスへ派生されます。その際、同じ基底クラスを複数の派生クラスを経由して1つの派生クラスに継承されることは許されないため、この非型パラメータを用いて別クラスにしています。<br>
425 例えば、下記のように定義すると、BaseFullAutoがDrivedFullAutoとDrivedHalfAutoを経由してTripledFullAutoへ継承されるためエラーになります。それを防ぐためにBaseFullAutoをクラス・テンプレートとし、DrivedFullAutoとDrivedHalfAutoへの継承は別実体としています。
426 @code
427 BaseFullAuto { };
428 DrivedFullAuto : public BaseFullAuto { };
429 DrivedHalfAuto : public BaseFullAuto { };
430 TripledFullAuto : public DrivedFullAuto, public DrivedHalfAuto { };
431 @endcode
432 
433 BaseFullAutoは侵入型半自動クラスPrivateInheritanceをprivate継承しています。<br>
434 BaseManualは侵入型半自動クラスProtectedInheritanceをprotected継承しています。<br>
435 侵入型を非侵入型へprivate/protected継承するとMinGWでビルド・エラーになる不具合が発生したため、その再発防止用です。<br>
436 
437 侵入型内部で定義しているstatic変数(kIsTheolizer)の有無で侵入型であることを判定していたのですが、private継承しているため非侵入型クラスにkIsTheolizerがprivateで存在していることになります。<br>
438 kIsTheolizerはアクセスできないのでSFINAEにより合致しないことを期待したのですが、「privateなのでアクセスできないエラー」となってしまいました。他の手段で判定し回避しました。
439 
440 @subsubsection DoubleTestImpl 5-2-2.二重組み合わせテスト本体
441 内容は、以下の通りです。
442 
443 1. 非侵入型完全自動クラス(DerivedFullAuto)<br>
444  BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, public継承しています。合計9個のクラスを継承しています。<br>
445  BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
446  private継承したクラス、および、DerivedFullAutoのprivateメンバ変数は全て初期値が維持されること、それら以外のクラスについてはBaseFullAutoのprivateメンバ以外は全て保存/回復されること、BaseFullAutoのprivateメンバは初期値が維持されることを検証しています。<br>
447 <br>
448 
449 2. 侵入型半自動クラス(DerivedHalfAuto)<br>
450  BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, public継承しています。合計9個のクラスを継承しています。<br>
451  BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
452  全ての継承したクラス、および、DerivedHalfAutoのメンバ変数において、BaseFullAuto型のprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
453 <br>
454 
455 3. 非侵入型手動クラス(DerivedManual)<br>
456  BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
457  BaseFullAuto, BaseHalfAuto, BaseManualのそれぞれを、publicメンバ変数として定義しています。<br>
458  全ての基底クラスと全てのメンバ変数について保存/回復処理関数を実装しています。
459  BaseFullAutoのprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
460 <br>
461 
462 @subsection TripledTest 5-3.三重組み合わせテスト
463 DerivedFullAuto, DerivedHalfAuto, DerivedManualを更に組み合わせて以下の自動テストを行います。
464 
465 
466 1. 非侵入型完全自動クラス(TripledFullAuto)<br>
467  DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
468  DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
469  TripledFullAutoクラスのprivateメンバ変数は全て初期値が維持されること、それら以外について、非侵入型完全自動クラスのprivateメンバは初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
470 <br>
471 
472 2. 侵入型半自動クラス(TripledHalfAuto)<br>
473  DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
474  DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、private, protected, publicメンバ変数として定義しています。<br>
475  非侵入型完全自動クラスのprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
476 <br>
477 
478 3. 非侵入型手動クラス(TripledManual)<br>
479  DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、public継承しています。合計3個のクラスを継承しています。<br>
480  DrivedFullAuto, DrivedHalfAuto, DrivedManualのそれぞれを、publicメンバ変数として定義しています。<br>
481  全ての基底クラスと全てのメンバ変数について保存/回復処理関数を実装しています。<br>
482  非侵入型完全自動クラスのprivateメンバは全て初期値が維持されること、それら以外については全て保存/回復されることを検証しています。<br>
483 <br>
484 
485 */