Theolizer
Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
7e.support_stl.h
[詳解]
1
//############################################################################
2
/*!
3
@brief ドキュメント・ファイル-使用方法(個別)
4
@ingroup Documents
5
@file 7e.support_stl.h
6
@author Yoshinori Tahara
7
@date 2017/02/08 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 SupportSTL スマート・ポインタ、および、標準コンテナ・サポートの使い方
39
ここでは、スマート・ポイントと標準コンテナをシリアライズするための機能について説明します。
40
41
基本は単にシリアライズするだけです。特別な操作は必要ありませんが、コンテナについては2つ応用的な使い方があります。
42
43
- コンテナへ保存する要素をオブジェクト追跡する場合
44
- 保存先指定機能(@ref Destinations )により分割保存したコンテナのデータを合成する場合
45
46
<br>
47
//############################################################################
48
@section HowToUseSmartPointer 1.スマート・ポインタのシリアライズ方法
49
//############################################################################
50
51
Theolizerはスマート・ポインタが管理するポインタをオーナー指定ポインタとしてシリアライズします。シリアライズする手順は通常のクラスと同じですが、少し注意事項があります。
52
53
スマート・ポインタをシリアライズするために、theolizer/memory.hをインクルードして下さい。
54
55
@code
56
#include <theolizer/memory.h>
57
@endcode
58
59
- unique_ptr<br>
60
unique_ptrは通常通りシリアライズ可能です。<br>
61
なお、`std::unique_ptr<T[]>`はサポートしていません。T[]をシリアライズするためには、その要素数が必要ですが管理されていないため、対応できないのです。<br>
62
63
- shared_ptr<br>
64
同じインスタンスを管理するshared_ptrを保存し回復すると、その状況を回復します。<br>
65
なお、同じインスタンスを管理するshared_ptrは同じオジェクト追跡単位内でシリアライズするようにして下さい。ポリモーフィズムにより回復処理中にポインタが置き換わった場合、シリアライズされていなかったshared_ptrとの共有状態が解除されます。<br>
66
67
- weak_ptr<br>
68
バインドしているshared_ptrをシリアライズします。ですので、shared_ptrと同様同じインスタンスを管理するものは同じオブジェクト追跡単位内でシリアライズして下さい。
69
70
<b>スマート・ポインタの保存と回復処理(source/reference_and_test/basic2/test_support_stl.cpp)</b><br>
71
unique_ptr、shared_ptr、weak_ptrの保存/回復のサンプル・ソースです。
72
73
@snippet basic2/test_support_stl.cpp SmartPtr
74
75
//############################################################################
76
@section HowToUseContainer 2.標準コンテナのシリアライズ方法
77
//############################################################################
78
79
Theolizerは各種標準コンテナのシリアライズにも対応しています。<br>
80
81
- それぞれ対応するインクルードが必要です。
82
- 一部の標準コンテナについて<br>
83
保存先指定による合成回復、および、各要素を被ポインタとすること(他のシリアライズ対象のポインタから指す)に対応しています。
84
85
下記にその対応表を示します。
86
87
|標準コンテナ|ヘッダ|被ポインタ対応|合成回復|
88
|------------|------|--------------|--------|
89
|`array`|`<theolizer/array.h>`|YES|YES|
90
|`vector`|同上|YES|YES|
91
|`vector<bool>`|`<theolizer/vector.h>`|NO|NO|
92
|`deque`|`<theolizer/deque.h>`|YES|YES|
93
|`forward_list`|`<theolizer/forward_list.h>`|YES|YES|
94
|`list`|`<theolizer/list.h>`|YES|YES|
95
|`set`|`<theolizer/set.h>`|NO|NO|
96
|`multiset`|同上|NO|NO|
97
|`map`|`<theolizer/map.h>`|YES|YES|
98
|`multimap`|同上|NO|NO|
99
|`unordered_set`|`<theolizer/unordered_set.h>`|NO|NO|
100
|`unordered_multiset`|同上|NO|NO|
101
|`unordered_map`|`<theolizer/unordered_map.h>`|YES|YES|
102
|`unordered_multimap`|同上|NO|NO|
103
104
特記事項が幾つかあります。
105
106
- キー無しコンテナは先頭から順番にデータを回復します。<br>
107
arrayはコンテナを拡張できないので、余分なシリアライス・データは破棄されます。<br>
108
それ以外のキー無しコンテナ(vector, deque, forward_list, list)はシリアライズ・データの方が多い場合、コンテナを拡張して回復します。<br>
109
両者ともシリアライズ・データの方が少ない場合、コンテナの余分な要素はそのまま保持されます。<br>
110
<br>
111
- mapとunordered_mapは合成回復に対応しています。<br>
112
これらはキー基準で回復しますので、保存先指定機能で分割したファイルを別々に編集した場合でも、同じキーのデータを同じインスタンスへ合成回復できます。<br>
113
<br>
114
- setとunordered_setについて<br>
115
これらは回復する際、シリアライズ・データを新規にコンストラクトしたインスタンスへ回復してからコンテナへ追加します。ですので、対応するシリアライズ・データがあった要素は単純回復(非合成回復)します。対応するシリアライズ・データがなかったコンテナの要素はそのまま維持されます。<br>
116
<br>
117
- キーの重複を許すコンテナについて<br>
118
multiset, multimap, unordered_multiset, unordered_multimapは、回復する際、一旦コンテナをクリアしてから、シリアライズ・データを回復します。これはキーの重複を許すため、シリアライズ・データと対応するコンテナの要素を特定できないためです。<br>
119
120
@subsection HowToUseContainer21 2-1.標準コンテナを通常の使い方で保存/回復するサンプル・ソース
121
122
<b>サンプル・ソース(source/reference_and_test/basic2/test_support_stl.cpp)</b><br>
123
124
@snippet basic2/test_support_stl.cpp ContaierNomal
125
126
@subsection HowToUseContainer22 2-2.標準コンテナの要素を被ポインタとする保存/回復するサンプル・ソース
127
128
<b>サンプル・ソース(source/reference_and_test/basic2/test_support_stl.cpp)</b><br>
129
130
@snippet basic2/test_support_stl.cpp ContaierPointee
131
132
@subsection HowToUseContainer23 2-3.標準コンテナの要素を合成回復サンプル・ソース
133
134
<b>サンプル・ソースsource/reference_and_test/basic2/test_support_stl.cpp)</b><br>
135
136
@snippet basic2/test_support_stl.cpp ContaierDestinations
137
138
<br>
139
//############################################################################
140
@section TestContainer 3.網羅的な使用例(自動テスト)の説明
141
//############################################################################
142
143
スマート・ポインタと標準コンテナのサポートについて、全てのシリアライザ、全ての書式でテストしています。
144
また、保存先指定で分割保存後、合成回復のテストも同様に全てのシリアライザ、全ての書式でテストしています。
145
146
@subsection TestContainer31 3-1.スマート・ポインタ
147
148
@subsubsection TestContainer311 3-1-1.通常
149
150
unique_ptrとweak_ptrについては、使い方説明にて保存/回復テストしています。
151
152
オーナー指定ポインタを回復する時、例えばある派生クラスAのインスタンスを指しているポインタへ異なる派生クラスBを回復する場合があります。その時、元の派生クラスAのインスタンスは解放し、派生クラスBのインスタンスをコンストラクトして回復します。
153
しかし、shared_ptrは他のshared_ptrとポイント先を共有しているため元のインスタンスを解放できません。そのための対策を実装していいます。(shared_ptr回復中フラグを設け、元のインスタンスはshared_ptr処理側で管理しています。)
154
その機能のテストのため、回復先のポインタが下記の3種類についてテストします。
155
- nullptrの時
156
- 回復するものと同じインスタンスを指している時
157
- 回復するものと異なるインスタンスを指している時
158
159
この時のシリアライズ対象クラスはSmartBaseとそれを派生したSmartDerivedです。
160
161
そして、それぞれについて、手動(トップ・レベル)、自動、手動(非トップ・レベル)による保存/回復をテストしています。
162
そのための補助クラスとして、SmartTestAutoとSmartTestManualを使っています。
163
164
<b>source/reference_and_test/basic2/test_support_stl.cpp</b>でテスト関数を定義してます。<br>
165
166
1. 保存処理<br>
167
template<class tSerializer><br>
168
void saveSupportStl(tSerializer& iSerializer)の前半<br>
169
<br>
170
171
2. 回復処理<br>
172
template<class tSerializer><br>
173
void loadSupportStl(tSerializer& iSerializer)の前半<br>
174
175
@subsubsection TestContainer312 3-1-2.合成回復
176
177
unique_ptrとshared_ptrについて、それが管理するクラスをDestAとDestBに分割して保存し合成回復できることを確認しています。
178
<b>source/reference_and_test/basic2/test_support_stl.cpp</b>でテスト関数を定義してます。<br>
179
180
1. 保存処理<br>
181
template<class tSerializer><br>
182
void saveSupportStlDestinations(tSerializer& iSerializer)の前半<br>
183
<br>
184
185
2. 回復処理<br>
186
template<class tSerializer><br>
187
void saveSupportStlDestinations(tSerializer& iSerializer)の前半<br>
188
189
@subsection TestContainer32 3-2.標準コンテナのテスト
190
191
@subsubsection TestContainer321 3-2-1.通常
192
193
サポートしている全てのコンテナについて、下記について正しく保存/回復できることをテストしています。
194
195
- 要素の型はint型とクラス(TestStl)
196
- 被ポインタをサポートしているコンテナについてはオブジェクト追跡
197
198
unorderedコンテナに対応するため、TestStlはstd::hashクラスを特殊化しています。
199
200
下記関数テンプレートを使っています。
201
202
|対象コンテナ|関数テンプレート|
203
|------------|----------------|
204
|array|saveContainerFixed, loadContainerFixed|
205
|vector(bool以外), deque, list, forward_list|saveContainer, loadContainer|
206
|set, multiset, unordered_set, unordered_multiset|saveContainerSet, loadContainerSet|
207
|map, multimap, unordered_map, unordered_multimap|saveContainerMap, loadContainerMap|
208
209
<b>source/reference_and_test/basic2/test_support_stl.cpp</b>でテスト関数を定義してます。<br>
210
211
1. 保存処理<br>
212
template<class tSerializer><br>
213
void saveSupportStl(tSerializer& iSerializer)の後半<br>
214
<br>
215
216
2. 回復処理<br>
217
template<class tSerializer><br>
218
void loadSupportStl(tSerializer& iSerializer)の後半<br>
219
220
@subsubsection TestContainer322 3-2-2.合成回復
221
222
合成回復をサポートしている全てのコンテナについて、下記について正しく保存/回復できることをテストしています。
223
224
- 要素の型はクラス(TestStlDestinations)<br>
225
TestStlDestinationsは保存先としてDestAとDestBを指定したメンバを定義しています。
226
227
下記関数テンプレートを使っています。
228
229
|対象コンテナ|関数テンプレート|
230
|------------|----------------|
231
|array|saveFixed, loadFixed|
232
|vector(bool以外), deque, list, forward_list|saveNoKey, loadNoKey|
233
|map, unordered_map|saveKey, loadeKey|
234
235
<b>source/reference_and_test/basic2/test_support_stl.cpp</b>でテスト関数を定義してます。<br>
236
237
1. 保存処理<br>
238
template<class tSerializer><br>
239
void saveSupportStlDestinations(tSerializer& iSerializer)の後半<br>
240
<br>
241
242
2. 回復処理<br>
243
template<class tSerializer><br>
244
void loadSupportStlDestinations(tSerializer& iSerializer)の後半<br>
245
246
*/
Theolizer
source
document
ja
7e.support_stl.h
© 2016
Theoride Technology
All Rights Reserved. "Theolizer" is a registered trademark of Theoride Technology.
構築:
1.8.12