Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
serializer_fast.h
1 //############################################################################
2 // Fastシリアライザ
3 // 同じプログラム内での最新版を保存/回復する。
4 // 最新版のみ対応。要素の追加/削除に対応していない。型チェック無し。
5 // 主にオブジェクトの保存指定要素のBackup/Restore/Copyに用いる。
6 //
7 // 注意事項:
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_SERIALIZER_FAST_H)
38 #define THEOLIZER_INTERNAL_SERIALIZER_FAST_H
39 
40 #include "internal/core.h"
41 
42 //############################################################################
43 // Begin
44 //############################################################################
45 
46 // ***************************************************************************
47 // 警告抑止
48 // ***************************************************************************
49 
50 #ifdef _MSC_VER
51  #pragma warning(push)
52  #pragma warning(disable:4100 4251)
53 #endif
54 
55 namespace theolizer
56 {
57 namespace internal
58 {
59 #ifndef THEOLIZER_INTERNAL_DOXYGEN
60 
61 //############################################################################
62 // 共通定義
63 //############################################################################
64 
65 // ***************************************************************************
66 // Fastシリアライザのバージョン番号
67 // ***************************************************************************
68 
69 const static unsigned kFastSerializerVersionNo=1;
70 
71 // ***************************************************************************
72 // プロバティ返却
73 // 必要な場合直接見えた方が良いのでここで定義
74 // ***************************************************************************
75 
76 inline bool hasPropertyFast(Property iProperty, bool iIsSaver)
77 {
78  bool ret=false;
79  switch(iProperty)
80  {
81  case Property::IsSaver:
82  ret=iIsSaver;
83  break;
84 
85  case Property::EncodedString:
86  ret=false;
87  break;
88 
89  case Property::SupportModifying:
90  ret=false;
91  break;
92 
93  case Property::BinaryOpen:
94  ret=true;
95  break;
96  }
97 
98  return ret;
99 }
100 
101 //############################################################################
102 // Fast Serializer実装部
103 //
104 // 各文字列型のエンコードは仮定しない。そのまま保存/回復する。
105 //############################################################################
106 
107 class FastMidISerializer;
108 
109 #endif // THEOLIZER_INTERNAL_DOXYGEN
110 
111 // ***************************************************************************
112 /*!
113 @brief 保存用中間FastSerializer
114 @details 主な処理はここで行うが、インスタンスを作れないよう抽象クラスとする。
115 */
116 // ***************************************************************************
117 
118 class THEOLIZER_INTERNAL_DLL FastMidOSerializer : public BaseSerializer
119 {
120 private:
121  friend class BaseSerializer;
122  THEOLIZER_INTERNAL_FRIENDS_FOR_INTERNAL;
123 
124 //----------------------------------------------------------------------------
125 // 基本
126 //----------------------------------------------------------------------------
127 
128  std::ostream& mOStream;
129 
130  static const unsigned kLastVersionNo=kFastSerializerVersionNo;
131 
133  typedef FastMidOSerializer MetaOSerializer; // メタ・シリアライザ
134  typedef FastMidISerializer MetaISerializer; // メタ・デシリアライザ
135 
136 protected:
137  static char const* const kSerializerName;
138  static std::ios_base::openmode kOpenMode;
139 
141  (
142  std::ostream& iOStream,
143  Destinations const& iDestinations,
144  GlobalVersionNoTableBase const*const iGlobalVersionNoTable,
145  unsigned iLastGlobalVersionNo,
146  bool iNoThrowException
147  );
148 
149 //----------------------------------------------------------------------------
150 // 型情報保存
151 //----------------------------------------------------------------------------
152 
153 private:
154 
155 // ---<<< ヘッダ保存 >>>---
156 
157  void writeHeader();
158 
159 //----------------------------------------------------------------------------
160 // データ保存
161 //----------------------------------------------------------------------------
162 
163 // ---<<< 制御情報保存 >>>---
164 
165  void saveControl(int iControl) {savePrimitive(iControl);}
166  void saveControl(long iControl) {savePrimitive(iControl);}
167  void saveControl(long long iControl) {savePrimitive(iControl);}
168  void saveControl(unsigned iControl) {savePrimitive(iControl);}
169  void saveControl(unsigned long iControl) {savePrimitive(iControl);}
170  void saveControl(unsigned long long iControl) {savePrimitive(iControl);}
171  void saveControl(std::string const& iControl) {saveString(iControl);}
172 
173 // ---<<< プリミティブ保存 >>>---
174 
175  #define THEOLIZER_INTERNAL_DEF_SAVE
176  #include "internal/primitive.inc"
177 
178 // ---<<< Element前処理 >>>---
179 
180  void writePreElement(bool iDoProcess=false) { }
181 
182 //----------------------------------------------------------------------------
183 // 内部処理
184 //----------------------------------------------------------------------------
185 
186 private:
187 
188 // ---<<< グループ処理 >>>---
189 
190  void saveGroupStart(bool iIsTop=false)
191  { }
192  void saveGroupEnd(bool iIsTop=false)
193  { }
194 
195 // ---<<< 各種構造処理 >>>---
196 
197  void saveStructureStart(Structure, std::string&, std::size_t iOjbectId)
198  {
199  if (iOjbectId != kInvalidSize) saveControl(iOjbectId);
200  }
201  void saveStructureEnd(Structure, std::string const& )
202  { }
203 
204 // ---<<< プリミティブ名返却 >>>---
205 
206  template<typename tType>
207  static char const* getPrimitiveName(unsigned iSerializerVersionNo)
208  {
209  return "";
210  }
211 
212 // ---<<< Element名保存 >>>---
213 
214  void saveElementName(ElementsMapping, char const*)
215  { }
216 
217 
218 // ---<<< 文字列保存 >>>---
219 
220  void saveString(std::string const& iString);
221 };
222 
223 // ***************************************************************************
224 /*!
225 @brief 回復用中間FastSerializer
226 @details 主な処理はここで行うが、インスタンスを作れないよう抽象クラスとする。
227 */
228 // ***************************************************************************
229 
230 class THEOLIZER_INTERNAL_DLL FastMidISerializer : protected BaseSerializer
231 {
232 private:
233  friend class BaseSerializer;
234  THEOLIZER_INTERNAL_FRIENDS_FOR_INTERNAL;
235 
236 //----------------------------------------------------------------------------
237 // 基本
238 //----------------------------------------------------------------------------
239 
240  std::istream& mIStream;
241 
242  static const unsigned kLastVersionNo=kFastSerializerVersionNo;
243 
245  typedef FastMidOSerializer MetaOSerializer; // メタ・シリアライザ
246  typedef FastMidISerializer MetaISerializer; // メタ・デシリアライザ
247 
248 protected:
249  static char const* const kSerializerName;
250  static std::ios_base::openmode kOpenMode;
251 
253  (
254  std::istream& iIStream,
255  Destinations const& iDestinations,
256  GlobalVersionNoTableBase const*const iGlobalVersionNoTable,
257  unsigned iLastGlobalVersionNo,
258  bool iNoThrowException
259  );
260 
261 //----------------------------------------------------------------------------
262 // ヘッダ回復と型チェック
263 //----------------------------------------------------------------------------
264 
265 private:
266 
267 // ---<<< ヘッダ情報回復 >>>---
268 
269  void readHeader();
270 
271 // ---<<< TypeIndex一致判定 >>>---
272 
273  bool isMatchTypeIndex(size_t iSerializedTypeIndex,
274  size_t iProgramTypeIndex);
275 
276 //----------------------------------------------------------------------------
277 // データ回復
278 //----------------------------------------------------------------------------
279 
280 private:
281 
282 // ---<<< 制御情報回復 >>>---
283 
284  void loadControl(int& oControl) {loadPrimitive(oControl);}
285  void loadControl(long& oControl) {loadPrimitive(oControl);}
286  void loadControl(long long& oControl) {loadPrimitive(oControl);}
287  void loadControl(unsigned& oControl) {loadPrimitive(oControl);}
288  void loadControl(unsigned long& oControl) {loadPrimitive(oControl);}
289  void loadControl(unsigned long long& oControl) {loadPrimitive(oControl);}
290  void loadControl(std::string& oControl) {loadString(oControl);}
291 
292 // ---<<< プリミティブ回復 >>>---
293 
294  #define THEOLIZER_INTERNAL_DEF_LOAD
295  #include "internal/primitive.inc"
296 
297 // ---<<< Element前処理 >>>---
298 
299  ReadStat readPreElement(bool iDoProcess=false) {return DontCare;}
300 
301 // ---<<< 要素破棄処理 >>>---
302 
303  void disposeElement()
304  { }
305 
306 //----------------------------------------------------------------------------
307 // 内部処理
308 //----------------------------------------------------------------------------
309 
310 private:
311 
312 // ---<<< グループ処理 >>>---
313 
314  void loadGroupStart(bool)
315  { }
316  void loadGroupEnd(bool)
317  { }
318 
319 // ---<<< 各種構造処理 >>>---
320 
321  void loadStructureStart(Structure, std::string&, std::size_t* oObjectId)
322  {
323  if (oObjectId) loadPrimitive(*oObjectId);
324  }
325  void loadStructureEnd(Structure, std::string const&)
326  { }
327 
328 // ---<<< プリミティブ名返却 >>>---
329 
330  template<typename tType>
331  static char const* getPrimitiveName(unsigned iSerializerVersionNo)
332  {return "";}
333 
334 // ---<<< Element名回復 >>>---
335 
336  std::string loadElementName(ElementsMapping iElementsMapping)
337  {return "";}
338 
339 // ---<<< 文字列回復 >>>---
340 
341  void loadString(std::string& iString);
342 };
343 
344 //############################################################################
345 // Fast Serializer I/Fクラス
346 // 保存先をテンプレートで指定する。
347 //
348 // 注意事項:
349 // FastBaseI/OSerializerから派生してテンプレート化している。
350 // FastBaseI/OSerializerを直接保存先のテンプレートとした場合、
351 // 使用した保存先全てに対して、コードが複製される。
352 // それを防ぐことが目的である。
353 //############################################################################
354 
355 #ifndef THEOLIZER_INTERNAL_DOXYGEN
356 
357 #endif // THEOLIZER_INTERNAL_DOXYGEN
358 } // namespace internal
359 
360 // ***************************************************************************
361 //! 保存用FastSerializer
362 // ***************************************************************************
363 
364 template<Destination uDefault=theolizerD::All, Destination... uDestinations>
366 {
367  THEOLIZER_INTERNAL_FRIENDS;
368 
369  void AbstructSerializer() { } // インスタンス生成許可
370 
371  static internal::Destinations const& getDestinations()
372  {
373  static const internal::Destinations destinations{uDefault, uDestinations...};
374  return destinations;
375  }
376 
377  // グローバル・バージョン番号テーブルへのポインタへのポインタ
378  constexpr static internal::GlobalVersionNoTableBase const*const*const
379  kPtrGlobalVersionNoTable=&internal::sGlobalVersionNoTable;
380 
383 
384  // Switcherアクセス用
385  using MidSerializer::kSerializerName;
386  using BaseSerializer::mIsSaver;
387 
388 public:
389  //! ofstream用std::ios_base::openmode
390  using MidSerializer::kOpenMode;
391 
392 #ifndef THEOLIZER_INTERNAL_DOXYGEN
393  static const bool kHasDestination=true;
394 #endif // THEOLIZER_INTERNAL_DOXYGEN
395 
396  //! コンストラクタ
397  FastOSerializer(std::ostream& iOStream, bool iNoThrowException=false) :
398  FastMidOSerializer
399  (
400  iOStream,
401  getDestinations(),
402  internal::sGlobalVersionNoTable,
403  kLastGlobalVersionNo,
404  iNoThrowException
405  )
406  { }
407 
408  //! FastOSerializerのプロパティ返却(@ref Property 参照)
409  static bool hasProperty(Property iProperty)
410  {
411  return internal::hasPropertyFast(iProperty, true);
412  }
413 
416  using BaseSerializer::getRequireClearTracking;
419  using ErrorBase::isError;
420  using ErrorBase::resetError;
421 };
422 
423 // ***************************************************************************
424 //! 回復用FastSerializer
425 // ***************************************************************************
426 
427 template<Destination uDefault=theolizerD::All, Destination... uDestinations>
429 {
430  THEOLIZER_INTERNAL_FRIENDS;
431 
432  void AbstructSerializer() { } // インスタンス生成許可
433 
434  static internal::Destinations const& getDestinations()
435  {
436  static const internal::Destinations destinations{uDefault, uDestinations...};
437  return destinations;
438  }
439 
440  // グローバル・バージョン番号テーブルへのポインタへのポインタ
441  constexpr static internal::GlobalVersionNoTableBase const*const*const
442  kPtrGlobalVersionNoTable=&internal::sGlobalVersionNoTable;
443 
446 
447  // Switcherアクセス用
448  using MidSerializer::kSerializerName;
449  using BaseSerializer::mIsSaver;
450 
451 public:
452  //! ifstream用std::ios_base::openmode
453  using MidSerializer::kOpenMode;
454 
455 #ifndef THEOLIZER_INTERNAL_DOXYGEN
456  static const bool kHasDestination=true;
457 #endif // THEOLIZER_INTERNAL_DOXYGEN
458 
459  //! コンストラクタ
460  FastISerializer(std::istream& iIStream, bool iNoThrowException=false) :
461  FastMidISerializer
462  (
463  iIStream,
464  getDestinations(),
465  internal::sGlobalVersionNoTable,
466  kLastGlobalVersionNo,
467  iNoThrowException
468  )
469  { }
470 
471  //! FastISerializerのプロパティ返却(@ref Property 参照)
472  static bool hasProperty(Property iProperty)
473  {
474  return internal::hasPropertyFast(iProperty, false);
475  }
476 
479  using BaseSerializer::getRequireClearTracking;
482  using ErrorBase::isError;
483  using ErrorBase::resetError;
484 };
485 
486 //############################################################################
487 // FastSerializerを用いたユーティリティ
488 //############################################################################
489 
490 namespace internal
491 {
492 #ifndef THEOLIZER_INTERNAL_DOXYGEN
493 
494 // ***************************************************************************
495 // バックアップ
496 // ***************************************************************************
497 
498 // 通常用
499 template<class tClass, THEOLIZER_INTERNAL_OVERLOAD((!IsTheolizerVersion<tClass>::value))>
500 void backupSerializable(tClass const& iInstance, std::ostream& oStream, bool iIsBackup=false)
501 {
502  FastOSerializer<> aSerializer(oStream);
503  {
504  THEOLIZER_PROCESS(aSerializer, iInstance);
505  }
506  aSerializer.clearTracking();
507 }
508 
509 // TheolizerVersion用
510 template<class tClass, THEOLIZER_INTERNAL_OVERLOAD((IsTheolizerVersion<tClass>::value))>
511 void backupSerializable(tClass const& iInstance, std::ostream& oStream, bool iIsBackup=false)
512 {
513  // const外し
514  typedef typename RemoveCV<tClass>::type Type;
515 
516  // 保存
517  FastOSerializer<> aSerializer(oStream);
518  {
519  BaseSerializer& aBaseSerializer=aSerializer;
520  THEOLIZER_INTERNAL_SAVE(aBaseSerializer, const_cast<Type&>(iInstance), etmDefault);
521  }
522  aSerializer.clearTracking();
523 }
524 
525 // ***************************************************************************
526 // リストア
527 // ***************************************************************************
528 
529 // 通常用
530 template<class tClass, THEOLIZER_INTERNAL_OVERLOAD((!IsTheolizerVersion<tClass>::value))>
531 void restoreSerializable(tClass& oInstance, std::istream& iStream, bool iIsBackup=false)
532 {
533  FastISerializer<> aSerializer(iStream);
534  {
535  THEOLIZER_PROCESS(aSerializer, oInstance);
536  }
537  aSerializer.clearTracking();
538 }
539 
540 // TheolizerVersion用
541 template<class tClass, THEOLIZER_INTERNAL_OVERLOAD((IsTheolizerVersion<tClass>::value))>
542 void restoreSerializable(tClass& oInstance, std::istream& iStream, bool iIsBackup=false)
543 {
544  // 回復
545  FastISerializer<> aSerializer(iStream);
546  {
547  BaseSerializer& aBaseSerializer=aSerializer;
548  THEOLIZER_INTERNAL_LOAD(aBaseSerializer, oInstance, etmDefault);
549  }
550  aSerializer.clearTracking();
551 }
552 
553 // ***************************************************************************
554 // メモリ・ストリーム(バックアップ/リストア/コピー用のバッファ)
555 // ***************************************************************************
556 
557 class THEOLIZER_INTERNAL_DLL MemoryStream
558 {
559 private:
560  struct Impl;
561  std::unique_ptr<Impl> mImpl;
562 
563 public:
564  MemoryStream() noexcept;
565  ~MemoryStream() noexcept;
566 
567  std::iostream& get() noexcept; // iostream返却
568  operator std::iostream&() noexcept
569  {
570  return get();
571  }
572  void clear(); // 内容と状態のクリア
573  void rewind(); // 読出ポインタを先頭へ巻き戻す
574 };
575 
576 #endif // THEOLIZER_INTERNAL_DOXYGEN
577 } // namespace internal
578 
579 // ***************************************************************************
580 //! シアライズ対象メンバをコピーする
581 // ***************************************************************************
582 
583 template<typename tType>
584 void copySerializable(tType const& iSource, tType& oDestination)
585 {
586  internal::MemoryStream aBuff;
587  backupSerializable(iSource, aBuff);
588  aBuff.rewind();
589  restoreSerializable(oDestination, aBuff);
590 }
591 
592 //############################################################################
593 // End
594 //############################################################################
595 
596 } // namespace theolizer
597 
598 // ***************************************************************************
599 // 警告抑止解除
600 // ***************************************************************************
601 
602 #ifdef _MSC_VER
603  #pragma warning(pop)
604 #endif
605 
606 #endif // THEOLIZER_INTERNAL_SERIALIZER_FAST_H
ErrorInfo const & getErrorInfo() const
エラー情報返却(3-1-2.メンバ関数 参照)
Definition: report.h:861
theolizer名前空間
Definition: base.h:53
#define THEOLIZER_PROCESS(dSerializer, dInstance)
通常の保存/回復処理マクロ(2-4-2.シリアライズ処理要求 参照)
Definition: serializer.h:67
static bool hasProperty(Property iProperty)
FastISerializerのプロパティ返却(3-1-3.プロパティ 参照)
unsigned getGlobalVersionNo() const
処理中のグローバル・バージョン番号返却(3-1-2.メンバ関数 参照)
void clearTracking()
オブジェクト追跡の区切り(3-1-2.メンバ関数 参照)
FastISerializer(std::istream &iIStream, bool iNoThrowException=false)
コンストラクタ
static bool hasProperty(Property iProperty)
FastOSerializerのプロパティ返却(3-1-3.プロパティ 参照)
回復用FastSerializer
void copySerializable(tType const &iSource, tType &oDestination)
シアライズ対象メンバをコピーする
回復用中間FastSerializer
保存用中間FastSerializer
bool isError()
エラー発生ならtrue(3-1-2.メンバ関数 参照)
Definition: report.h:864
保存用FastSerializer
Destination
保存先シンボルを定義するscoped enum型
Property
シリアライザが提供する機能(プロパティ)のリスト
FastOSerializer(std::ostream &iOStream, bool iNoThrowException=false)
コンストラクタ
CheckMode getCheckMode()
現在のCheckMode返却(3-1-2.メンバ関数 参照)