Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
memory.h
[詳解]
1 //############################################################################
2 /*!
3  @brief スマート・ポインタ群のシリアライズ
4  @ingroup SerializationStl
5  @file memory.h
6  @author Yoshinori Tahara(Theoride Technology)
7  @date 2016/09/03 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 #if !defined(THEOLIZER_INTERNAL_UNIQUE_PTR_H)
38 #define THEOLIZER_INTERNAL_UNIQUE_PTR_H
39 
40 #ifndef THEOLIZER_INTERNAL_DOXYGEN
41 
42 //############################################################################
43 // Begin
44 //############################################################################
45 
46 #include <memory>
47 #include <map>
48 #include "serializer.h"
49 
50 THEOLIZER_PROVIDED_BY("Theoride Technology");
51 
52 //############################################################################
53 // std::unique_ptr<>
54 //############################################################################
55 
56 // ***************************************************************************
57 // std::unique_ptr<>のデフォルト・パラメータ:std::default_delete<>
58 // ***************************************************************************
59 
60 THEOLIZER_TEMPLATE_PARAMETER_TEMPLATE((template<class T>),
61  std::default_delete, (T),
62  default_deleteTheolizer);
63 
64 // ***************************************************************************
65 // シリアライズ指定
66 // ***************************************************************************
67 
68 THEOLIZER_NON_INTRUSIVE_TEMPLATE_ORDER((template<class T, class D>),
69  (std::unique_ptr<T, D>), 1,
70  unique_ptrTheolizer);
71 
72 //----------------------------------------------------------------------------
73 // ユーザ定義
74 //----------------------------------------------------------------------------
75 
76 // ---<<< Version.1 >>>---
77 
78 template<class T, class D>
79 template<class tMidSerializer, class tTheolizerVersion>
80 struct TheolizerNonIntrusive<std::unique_ptr<T, D>>::
81  TheolizerUserDefine<tMidSerializer, tTheolizerVersion, 1>
82 {
83  // 保存
84  static void saveClassManual
85  (
86  tMidSerializer& iSerializer,
87  typename tTheolizerVersion::TheolizerTarget const*const& iInstance
88  )
89  {
90  static_assert(!std::is_array<T>::value,
91  "[Theolizer] Can not support array type for std::unique_ptr<>.");
92  THEOLIZER_REGISTER_TEMPLATE_PARAMETER(D);
93 
94  THEOLIZER_PROCESS_OWNER(iSerializer, iInstance->get());
95  }
96 
97  // 回復
98  static void loadClassManual
99  (
100  tMidSerializer& iSerializer,
101  typename tTheolizerVersion::TheolizerTarget*& oInstance
102  )
103  {
104  static_assert(!std::is_array<T>::value,
105  "[Theolizer] Can not support array type for std::unique_ptr<>.");
106 
107  THEOLIZER_REGISTER_TEMPLATE_PARAMETER(D);
108 
109  // もし、nullptrなら、インスタンス生成
110  if (!oInstance) oInstance=new typename tTheolizerVersion::TheolizerTarget();
111 
112  typedef typename tTheolizerVersion::TheolizerTarget TheolizerTarget;
113  typedef typename TheolizerTarget::element_type ElementType;
114 
115  // ポイント先を解放して入れ替える可能性があるので一旦管理から外す
116  struct AuteRestore
117  {
118  TheolizerTarget& mUniquePtr;
119  ElementType* mInstance;
120  AuteRestore(TheolizerTarget& iUniquePtr) :
121  mUniquePtr(iUniquePtr),
122  mInstance(mUniquePtr.release())
123  { }
124  ~AuteRestore()
125  {
126  mUniquePtr.reset(mInstance);
127  }
128  } aAutoRestore(*oInstance);
129  THEOLIZER_PROCESS_OWNER(iSerializer, aAutoRestore.mInstance);
130  }
131 };
132 
133 //----------------------------------------------------------------------------
134 // 自動生成
135 //----------------------------------------------------------------------------
136 
137 #ifdef THEOLIZER_WRITE_CODE // ###### std::unique_ptr<T,D> ######
138 
139 #define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1)
140 #define THEOLIZER_GENERATED_CLASS_TYPE THEOLIZER_INTERNAL_UNPAREN(std::unique_ptr<T, D>)
141 #define THEOLIZER_GENERATED_PARAMETER_LIST template<class T, class D>
142 #define THEOLIZER_GENERATED_UNIQUE_NAME unique_ptrTheolizer
143 
144 // ---<<< Version.1 >>>---
145 
146 #define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1)
147 #define THEOLIZER_GENERATED_CLASS_NAME()\
148  THEOLIZER_INTERNAL_TEMPLATE_NAME((u8"std::unique_ptr",T,D))
149 #include <theolizer/internal/version_manual.inc>
150 #undef THEOLIZER_GENERATED_VERSION_NO
151 
152 #endif//THEOLIZER_WRITE_CODE // ###### std::unique_ptr<T,D> ######
153 
154 //############################################################################
155 // std::shared_ptr<>
156 //############################################################################
157 
158 // ***************************************************************************
159 // シリアライズ指定
160 // ***************************************************************************
161 
162 THEOLIZER_NON_INTRUSIVE_TEMPLATE_ORDER((template<class T>),
163  (std::shared_ptr<T>), 1,
164  shared_ptrTheolizer);
165 
166 //----------------------------------------------------------------------------
167 // ユーザ定義
168 //----------------------------------------------------------------------------
169 
170 struct shared_ptrTheolizer;
171 
172 // ---<<< Version.1 >>>---
173 
174 template<class T>
175 template<class tMidSerializer, class tTheolizerVersion>
176 struct TheolizerNonIntrusive<std::shared_ptr<T>>::
177  TheolizerUserDefine<tMidSerializer, tTheolizerVersion, 1>
178 {
179  // 保存
180  static void saveClassManual
181  (
182  tMidSerializer& iSerializer,
183  typename tTheolizerVersion::TheolizerTarget const*const& iInstance
184  )
185  {
186  THEOLIZER_PROCESS_OWNER(iSerializer, iInstance->get());
187  }
188 
189  // 回復
190  static void loadClassManual
191  (
192  tMidSerializer& iSerializer,
193  typename tTheolizerVersion::TheolizerTarget*& oInstance
194  )
195  {
196  // もし、nullptrなら、インスタンス生成
197  if (!oInstance) oInstance=new typename tTheolizerVersion::TheolizerTarget();
198 
199  typedef typename tTheolizerVersion::TheolizerTarget TheolizerTarget;
200  typedef typename TheolizerTarget::element_type ElementType;
201  ElementType* aInstance=oInstance->get();
202  {
203  theolizer::internal::AutoRestoreIsShared aAutoRestoreIsShared(iSerializer, true);
204  THEOLIZER_PROCESS_OWNER(iSerializer, aInstance);
205  }
206 
207  // nullptrなら追跡しない
208  if (!aInstance)
209  {
210  oInstance->reset();
211  return;
212  }
213 
214  // 既に共有されているならそれを用いる
215  // 登録リスト獲得
216  typedef std::map<void const*, std::shared_ptr<void const> > SharedPtrMap;
217  SharedPtrMap& aSharedPtrMap=
218  iSerializer.template getSharedPtrTable<SharedPtrMap>(typeid(shared_ptrTheolizer));
219 
220  // 派生クラスのインタンスへのポインタ獲得
221  void const* aDerivedPointer=theolizer::internal::getDerivedPointer(aInstance);
222 
223  // 既に回復したことのあるポインタ
224  auto aFound=aSharedPtrMap.find(aDerivedPointer);
225  if (aFound != aSharedPtrMap.end())
226  {
227  *oInstance=std::shared_ptr<ElementType>(aFound->second, aInstance);
228  }
229 
230  // 初めて
231  else
232  {
233  if (aInstance != oInstance->get())
234  {
235  oInstance->reset(aInstance);
236  }
237  std::shared_ptr<void const> temp(*oInstance, aDerivedPointer);
238  aSharedPtrMap.insert(aFound, std::make_pair(aDerivedPointer, temp));
239  }
240  }
241 };
242 
243 //----------------------------------------------------------------------------
244 // 自動生成
245 //----------------------------------------------------------------------------
246 
247 #ifdef THEOLIZER_WRITE_CODE // ###### std::shared_ptr<T> ######
248 
249 #define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1)
250 #define THEOLIZER_GENERATED_CLASS_TYPE THEOLIZER_INTERNAL_UNPAREN(std::shared_ptr<T>)
251 #define THEOLIZER_GENERATED_PARAMETER_LIST template<class T>
252 #define THEOLIZER_GENERATED_UNIQUE_NAME shared_ptrTheolizer
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_TEMPLATE_NAME((u8"std::shared_ptr",T))
259 #include <theolizer/internal/version_manual.inc>
260 #undef THEOLIZER_GENERATED_VERSION_NO
261 
262 #endif//THEOLIZER_WRITE_CODE // ###### std::shared_ptr<T> ######
263 
264 //############################################################################
265 // std::weak_ptr<>
266 //############################################################################
267 
268 // ***************************************************************************
269 // シリアライズ指定
270 // ***************************************************************************
271 
272 THEOLIZER_NON_INTRUSIVE_TEMPLATE_ORDER((template<class T>),
273  (std::weak_ptr<T>), 1,
274  weak_ptrTheolizer);
275 
276 //----------------------------------------------------------------------------
277 // ユーザ定義
278 //----------------------------------------------------------------------------
279 
280 struct weak_ptrTheolizer;
281 
282 // ---<<< Version.1 >>>---
283 
284 template<class T>
285 template<class tMidSerializer, class tTheolizerVersion>
286 struct TheolizerNonIntrusive<std::weak_ptr<T>>::
287  TheolizerUserDefine<tMidSerializer, tTheolizerVersion, 1>
288 {
289  // 保存
290  static void saveClassManual
291  (
292  tMidSerializer& iSerializer,
293  typename tTheolizerVersion::TheolizerTarget const*const& iInstance
294  )
295  {
296  THEOLIZER_PROCESS(iSerializer, iInstance->lock());
297  }
298 
299  // 回復
300  static void loadClassManual
301  (
302  tMidSerializer& iSerializer,
303  typename tTheolizerVersion::TheolizerTarget*& oInstance
304  )
305  {
306  // もし、nullptrなら、インスタンス生成
307  if (!oInstance) oInstance=new typename tTheolizerVersion::TheolizerTarget();
308 
309  typedef typename tTheolizerVersion::TheolizerTarget TheolizerTarget;
310  typedef typename TheolizerTarget::element_type ElementType;
311 
312  std::shared_ptr<ElementType> aShared(oInstance->lock());
313  THEOLIZER_PROCESS(iSerializer, aShared);
314  *oInstance=aShared;
315  }
316 };
317 
318 //----------------------------------------------------------------------------
319 // 自動生成
320 //----------------------------------------------------------------------------
321 
322 #ifdef THEOLIZER_WRITE_CODE // ###### std::weak_ptr<T> ######
323 
324 #define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1)
325 #define THEOLIZER_GENERATED_CLASS_TYPE THEOLIZER_INTERNAL_UNPAREN(std::weak_ptr<T>)
326 #define THEOLIZER_GENERATED_PARAMETER_LIST template<class T>
327 #define THEOLIZER_GENERATED_UNIQUE_NAME weak_ptrTheolizer
328 
329 // ---<<< Version.1 >>>---
330 
331 #define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1)
332 #define THEOLIZER_GENERATED_CLASS_NAME()\
333  THEOLIZER_INTERNAL_TEMPLATE_NAME((u8"std::weak_ptr",T))
334 #include <theolizer/internal/version_manual.inc>
335 #undef THEOLIZER_GENERATED_VERSION_NO
336 
337 #endif//THEOLIZER_WRITE_CODE // ###### std::weak_ptr<T> ######
338 
339 //############################################################################
340 // End
341 //############################################################################
342 
343 #endif // THEOLIZER_INTERNAL_DOXYGEN
344 #endif // THEOLIZER_INTERNAL_UNIQUE_PTR_H
#define THEOLIZER_PROCESS(dSerializer, dInstance)
通常の保存/回復処理マクロ(2-4-2.シリアライズ処理要求 参照)
Definition: serializer.h:67
#define THEOLIZER_PROVIDED_BY(dVendor)
ソース自動生成制御
#define THEOLIZER_PROCESS_OWNER(dSerializer, dInstance)
オーナ・ポインタ用の保存/回復処理マクロ(2-4-2.シリアライズ処理要求 参照)
Definition: serializer.h:91
TheolizerライブラリのAPI部