Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
enum型のバリエーション

Theolizerは下記のenum型をシリアライズするための機能を持っています。

対応するenum型

  • 従来のenum型
  • C++11で追加されたscoped enum型

Theolizerのenum型サポート

  • 非侵入型完全自動
  • 非侵入型半自動
    非侵入型半自動は、下記オプションを指定します。
    • シンボル名保存(デフォルト)
    • シンボル値保存

ここでは、これらの使い方と自動テストについて説明します。


1.非侵入型完全自動enum型

非侵入型完全自動enum型は、パラメータ指定が存在しませんのでシンボル名固定です。
非侵入型完全自動enum型の使い方は2.基本的な使い方 で説明していますのでそちらを御覧ください。


2.非侵入型半自動enum型

enum型をシリアライズ対象であることを明示的に指定する際に、下記マクロを用いることができます。

それぞれのパラメータは以下の通りです。

enum EnumSymName
{
eesnDef=1000,
eesnVal
};

例えば、上記ように定義されている時、次の構文でEnumSymNameをシリアライズ対象として指定します。

THEOLIZER_ENUM(EnumSymName, 1);

保存/回復処理は従来通りです。

//----------------------------------------------------------------------------
// 保存
//----------------------------------------------------------------------------
{
std::ofstream aStream("tutorise_enum_variation.json");
theolizer::JsonOSerializer<> aSerializer(aStream);
// 非侵入型半自動(シンボル名対応)
EnumSymName aEnumSymName=eesnVal;
THEOLIZER_PROCESS(aSerializer, aEnumSymName);
// 非侵入型半自動(シンボル値対応)
EnumSymVal aEnumSymVal=eesvVal;
THEOLIZER_PROCESS(aSerializer, aEnumSymVal);
}
//----------------------------------------------------------------------------
// 回復
//----------------------------------------------------------------------------
{
std::ifstream aStream("tutorise_enum_variation.json");
theolizer::JsonISerializer<> aSerializer(aStream);
// 非侵入型半自動(シンボル名対応)
EnumSymName aEnumSymName=eesnDef;
THEOLIZER_PROCESS(aSerializer, aEnumSymName);
THEOLIZER_EQUAL(aEnumSymName, eesnVal);
// 非侵入型半自動(シンボル値対応)
EnumSymVal aEnumSymVal=eesvDef;
THEOLIZER_PROCESS(aSerializer, aEnumSymVal);
THEOLIZER_EQUAL(aEnumSymVal, eesvVal);
}

シリライズされたtutorise_enum_variation.json は以下の通りです。

json
{
"SerialzierName":"JsonTheolizer",
"GlobalVersionNo":1,
"TypeInfoList":[1]
}
"eesnVal"
3001


3.網羅的な使用例(自動テスト)の説明

網羅的な自動テスト用のクラスはsource/reference_and_test/basic/test_enum_variation.h ファイルで定義しています。
また、テスト処理はsource/reference_and_test/basic/test_enum_variation.cpp ファイルで定義しており、saveEnumVariation()関数で保存処理、loadEnumVariation()関数で回復処理と値の検証を行っています。

test_enum_variation.h ファイル先頭でDEFINE_ENUM()マクロを定義しています。

#define DEFINE_ENUM() \
/* デフォルト */ \
DEFINE(Default, ) \
/* 文字型 */ \
DEFINE(Char, : char ) \
DEFINE(SChar, : signed char ) \
DEFINE(UChar, : unsigned char ) \
DEFINE(Wchar, : wchar_t ) \
DEFINE(Char16, : char16_t ) \
DEFINE(Char32, : char32_t ) \
/* 整数型 */ \
DEFINE(Short, : short ) \
DEFINE(UShort, : unsigned short ) \
DEFINE(Int, : int ) \
DEFINE(UInt, : unsigned int ) \
DEFINE(Long, : long ) \
DEFINE(ULong, : unsigned long ) \
DEFINE(LongLong, : long long ) \
DEFINE(ULongLong, : unsigned long long)

C++11規格でenum型の値を保存する整数型を基底型として指定できるようになりました。その全ての基底型(指定していないものも含む)に対して自動テストを容易に展開できるようにするためのマクロです。
このマクロを展開する直前でDEFINE()マクロを定義することで、enum型の定義、初期化、保存、回復、値チェックのためのコードを生成しています。

下記の3種類のTheolizer機能に分けて自動テストを実装しています。

  • 非侵入型完全自動
  • 非侵入型半自動(シンボル名対応)
  • 非侵入型半自動(シンボル値対応)

それぞれについて下記定義を行っています。

  1. 通常のenum型定義
  2. Scoped enum型定義
  3. トップ・レベルの保存(左辺値)/保存(右辺値)/回復関数定義
    • 非侵入型完全自動
      saveLValueEnumFullAuto, saveRValueEnumFullAuto, loadEnumFullAuto
    • 非侵入型半自動(シンボル名対応)
      saveLValueEnumSymName, saveRValueEnumSymName, loadEnumSymName
    • 非侵入型半自動(シンボル値対応)
      saveLValueEnumFSymVal, saveRValueEnumFSymVal, loadEnumSymVal
  4. 非侵入型完全自動クラスのメンバとしての定義(メンバ・リスト自動生成対応の検証のため)
  5. 非侵入型手動クラスのメンバとしての定義(非トップ・レベルの保存/回復検証のため)

3.と5.については、THEOLIZER_PROCESS()で保存/回復しますが、THEOLIZER_PROCESS()は定数の保存も可能なので、左辺値と右辺値(定数)をテストします。定数への回復はできないので、回復は左辺値のみです。