Skip to content

Commit

Permalink
クラス変更テスト実装完了 Issue #27 #33
Browse files Browse the repository at this point in the history
バージョンをv0.5.0へ変更

----------------- MD5 Hash Values -----------------
TheolizerDriver  : a1273c718a5c10eb29d7c9088485c5c7
TheolizerLibrary : 283f0c1af7bb4248f3a74669895bac58
Library's Header : 42e15dafa4ed89c5ef979729f358b425
  • Loading branch information
yossi-tahara committed Apr 20, 2017
1 parent 71013cb commit d42ad05
Show file tree
Hide file tree
Showing 37 changed files with 1,556 additions and 390 deletions.
2 changes: 1 addition & 1 deletion build_tools/.travis.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ if("$ENV{PARALLEL_TEST}" STREQUAL "1")
elseif("$ENV{PARALLEL_TEST}" STREQUAL "2")
build_by_gcc(gcc540 64 StaticWithBoost TRUE FALSE "14 1" "11 1")
else()
build_by_gcc(gcc540 64 StaticWithBoost TRUE FALSE "29 1" "11 1")
build_by_gcc(gcc540 64 StaticWithBoost TRUE FALSE "32 1" "11 1")
endif()

#output_title("****** Static ******")
Expand Down
6 changes: 3 additions & 3 deletions build_tools/linux.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,12 @@ set(ENV{LC_ALL} "C")
#-----------------------------------------------------------------------------

output_title("****** StaticWithBoost ******")
build_by_gcc(gcc540 64 StaticWithBoost TRUE TRUE "32 1" "11 1")
build_by_gcc(gcc540 64 StaticWithBoost TRUE TRUE "35 1" "11 1")

output_title("****** Static ******")
build_by_gcc(gcc540 64 Static FALSE FALSE "32 1" "11 1")
build_by_gcc(gcc540 64 Static FALSE FALSE "35 1" "11 1")

output_title("****** Shared ******")
build_by_gcc(gcc540 64 Shared FALSE FALSE "32 1" "11 1")
build_by_gcc(gcc540 64 Shared FALSE FALSE "35 1" "11 1")

output_summary()
24 changes: 12 additions & 12 deletions build_tools/windows.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -109,21 +109,21 @@ file(WRITE ${SUMMARY} "")
#-----------------------------------------------------------------------------

#output_title("****** StaticWithBoost ******")
build_by_msvc(msvc2015 64 StaticWithBoost TRUE TRUE "32 11 1 1")
build_by_msvc(msvc2015 32 StaticWithBoost TRUE TRUE "32 11 1 1")
build_by_gcc( mingw540 64 StaticWithBoost TRUE TRUE "32 1" "11 1")
build_by_gcc( mingw540 32 StaticWithBoost TRUE TRUE "32 1" "11 1")
build_by_msvc(msvc2015 64 StaticWithBoost TRUE TRUE "35 11 1 1")
build_by_msvc(msvc2015 32 StaticWithBoost TRUE TRUE "35 11 1 1")
build_by_gcc( mingw540 64 StaticWithBoost TRUE TRUE "35 1" "11 1")
build_by_gcc( mingw540 32 StaticWithBoost TRUE TRUE "35 1" "11 1")

output_title("****** Static ******")
build_by_msvc(msvc2015 64 Static FALSE FALSE "32 11 1 1")
build_by_msvc(msvc2015 32 Static FALSE FALSE "32 11 1 1")
build_by_gcc( mingw540 64 Static FALSE FALSE "32 1" "11 1")
build_by_gcc( mingw540 32 Static FALSE FALSE "32 1" "11 1")
build_by_msvc(msvc2015 64 Static FALSE FALSE "35 11 1 1")
build_by_msvc(msvc2015 32 Static FALSE FALSE "35 11 1 1")
build_by_gcc( mingw540 64 Static FALSE FALSE "35 1" "11 1")
build_by_gcc( mingw540 32 Static FALSE FALSE "35 1" "11 1")

output_title("****** Shared ******")
build_by_msvc(msvc2015 64 Shared FALSE FALSE "32 11 1 1")
build_by_msvc(msvc2015 32 Shared FALSE FALSE "32 11 1 1")
build_by_gcc( mingw540 64 Shared FALSE FALSE "32 1" "11 1")
build_by_gcc( mingw540 32 Shared FALSE FALSE "32 1" "11 1")
build_by_msvc(msvc2015 64 Shared FALSE FALSE "35 11 1 1")
build_by_msvc(msvc2015 32 Shared FALSE FALSE "35 11 1 1")
build_by_gcc( mingw540 64 Shared FALSE FALSE "35 1" "11 1")
build_by_gcc( mingw540 32 Shared FALSE FALSE "35 1" "11 1")

output_summary()
4 changes: 2 additions & 2 deletions source/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ message(STATUS "CI_SERVICE =${CI_SERVICE}")
# Project version
#-----------------------------------------------------------------------------

project(Theolizer VERSION 0.4.5)
set(TEMPORARY_VERSION "-Prerelease.")
project(Theolizer VERSION 0.5.0)
#set(TEMPORARY_VERSION "-Prerelease.")

message(STATUS "PROJECT_VERSION=${PROJECT_VERSION}${TEMPORARY_VERSION}")

Expand Down
83 changes: 62 additions & 21 deletions source/document/ja/2.specification.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,14 +236,16 @@ abort()しないために`シリアライザのインスタンス.resetError();`
// ***************************************************************************
@subsection Basic16 1-6.制約事項
// ***************************************************************************
@subsubsection Basic161 1-6-1.デフォルト・コンストラクタが必要
原則として、シリアライズするクラスにはデフォルト・コンストラクタが必要です。<br>
Theolizerにて自動生成する際、デフォルト・コンストラクタを用いるためです。<br>
ただし、下記は例外です。<br>
@subsubsection Basic161 1-6-1.デフォルト・コンストラクタが必要なクラス
原則として、シリアライズするクラスにはデフォルト・コンストラクタは不要ですが、一部必要なものがあります。<br>
それはオーナー指定ポインタとしてシリアライズする非侵入型完全自動クラスと侵入型半自動クラスです。<br>
- THEOLIZER_PROCESS*マクロを用いてトップ・レベルだけから保存/回復するクラス<br>
トップ・レベルの(ポインタではない)インスタンスに対してTheolizerは領域生成しません。<br>
<br>
オーナー指定ポインタが以下のどちらかの場合に、デシリアライズする際に対象クラスをデフォルト・コンストラクタで生成するためです。・・・①
- nullptr
- シリアライズ・データ上のクラスAと異なるクラスBのインタンスをポイントしていた場合<br>
この場合は、ポイントしていたクラスBのインスタンスをdelete後にクラスAをnewします。
なお、①の条件の時、非侵入型手動についてはユーザ定義のloadClassManual()関数内でコンストラクトするため、ユーザ側にて呼び出すコンストラクタを決定できます。
@subsubsection Basic162 1-6-2.クラスのstatic変数について
これは自動シリアライズの対象としていません。
Expand Down Expand Up @@ -380,24 +382,40 @@ Theolizerは旧プログラムのバージョン番号を指定してデータ
この番号を用いて、各クラス、および、enum型を回復後、カスケードにバージョン・アップ処理を行うことで最新版のデータを回復します。
// ***************************************************************************
@subsection Basic33 3-3.クラス・メンバ変数のキープ・ステップ
@subsection Basic33 3-3.クラス・メンバ変数のKeep-step
// ***************************************************************************
クラスに含まれるクラス型のメンバ変数A、および、基底クラスBについて、down/upVersion関数でA, Bのメンバにアクセスしたいケースがあります。<br>
そのA, Bについてdown/upVersionを記述した時のクラス定義最新版(当該バージョン番号におけるメンバ定義の最新版)を、下記の場合に使えます。<br>
クラスAに含まれるクラスBのメンバ変数x、および、基底クラスyについて、down/upVersion関数でx, yのメンバにアクセスしたいケースがあります。<br>
そして、クラスAをバージョン・アップする際にクラスBもバージョン・アップされることもあります。<br>
このような場合で、クラスAのdown/upVersion関数を記述する際に、クラスBの当時のバージョンのメンバ変数を使いたいこともあると思います。<br>
以下の条件を満たした基底クラスとメンバ変数については、それを含むクラスと「足並みを揃えて(Keep-step)」バージョン・ダウン/アップ処理され、各down/upVersion関数を定義した当時のメンバを提供します。
- 基底クラスの場合<br>
自動型(非侵入型完全自動、侵入型半自動)クラスの基底クラスはKeep-step処理されます。<br>
- 自動型(非侵入型完全自動、侵入型半自動)が直接(ポインタ経由でなく)定義されている場合<br>
- メンバ変数の場合<br>
自動型(非侵入型完全自動、侵入型半自動)クラスとenum型のメンバ変数はKeep-step処理されます。<br>
ただし、ポインタや参照の場合を除きます。
この条件を満たしたメンバと基底クラスについては、それを含むクラスと「足並みを揃えて(Keep-step)」バージョン・ダウン/アップ処理されます。
逆にKeep-step処理しないものは以下の通りです。
- プリミティブ型(int型やstd::string型等)
- 非侵入型手動クラス
- 全てのポインタ
- 全ての参照
なお、ポインタの指す領域については足並みを揃える処理を行わないので、アクセスできる内容はバージョン番号が最も新しい最新版となります。また、ポイント先のデータが既に回復されていることを保証するのはプログラマの責任です。保存した順序で回復されますので、アクセスする場合は先に保存して下さい。
なお、配列については配列の基底型により上記の通りKeep-step処理を判定します。
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333; border-radius: 10px; background-color: #d0d0d0;">
なお、ポインタや参照が指す領域については足並みを揃える処理を行わないので、アクセスできる内容はバージョン番号が最も新しい最新版となります。また、ポイント先のデータが既に回復されていることを保証するのはプログラマの責任です。保存した順序で回復されますので、アクセスする場合は先に保存して下さい。
</div>
// ***************************************************************************
@subsection Basic34 3-4.保存先指定等の要因で一部のメンバが回復されていない時
// ***************************************************************************
追加されたメンバがある場合、もしくは、保存先指定でクラス分割されている場合、旧バージョン・データから回復した時、ファイルに記録されていないメンバについては回復されません。従って、upVersion処理にて回復されていないメンバが存在する可能性があります。<br>
そこで、up/downVersion関数を記述する場合は、追加した変数をup/downVersion関数内で使用しないこと、できるだけクラス分割しないことお勧めします。
そこで、down/upVersion関数を記述する場合は、追加した変数をdown/upVersion関数内で使用しないこと、できるだけクラス分割しないことお勧めします。
クラス分割とup/downVersion処理の両方が必要な場合は下記をお薦めします
クラス分割とdown/upVersion処理の両方が必要な場合は下記をお薦めします
- 同じ保存先へ保存したデータを使うようにして下さい<br>
下記の時、<br>
Expand All @@ -410,15 +428,38 @@ Theolizerは旧プログラムのバージョン番号を指定してデータ
@subsection Basic35 3-5.旧バージョン処理時、メンバが回復されなかった時に発生する問題点対応
// ***************************************************************************
downVersion後upVersionで元に戻らないような修正を行うことは多いと思います。(例えは、downVersion関数を記述せずupVersion関数のみを記述すると該当します。)<br>
何も手当しない場合、シリアライズ・データを回復する時、回復対象でないメンバがup/downVersion関数処理の結果、不適切に変化してしまいます。保存時は当然全てのデータは回復されないため更に深刻です。<br>
何も手当しない場合、シリアライズ・データを回復する時、回復対象でないメンバがdown/upVersion関数処理の結果、不適切に変化してしまいます。<br>
これを避けるため、Theolizerは、downVersion時にバックアップし回復されなかったメンバについてupVersion時にリストアしています。(旧バージョン保存時は全てのデータが回復されないため、全てのデータをリストアします。)<br>
その回復されたかどうかを示すフラグとして、変数名にTheolizerSucceedを追加した名前のbool型変数を用意しています。回復されたメンバはtrueとなり、旧バージョンの値を新バージョン側へ引き継ぎます。
これを避けるため、以下の対策を実装しています。
- down/upVersion関数で変更可能な対象を限定<br>
プリミティブ型(int型やstd::string型)、および、enum型に限定しています。<br>
- 変更可能なものについてはdownVersion時コピーする<br>
当該変数をコピーした後で、downVersion処理することで元の変数への影響を回避します。<br>
- データを回復したかどうかを管理する<br>
データを回復した変数はupVersion時、次バージョンへ反映する必要があります。<br>
また、回復しなかった変数は元の値を変更するべきではありませんので、反映しません。<br>
この制御のため、mDoSucceedというフラグを①の管理領域に設け、trueの時次バージョンへ反映します。<br>
// ***************************************************************************
@subsection Basic36 3-6.up/downVersion関数でポインタの先を変更してはいけません
@subsection Basic36 3-6.down/upVersion関数で変更可能な変数と変更してはいけない変数のまとめ
// ***************************************************************************
ポインタが指す先はクラス外のデータですので3-5のバックアップ/リストア対象ではありません。<br>
従って、もし、downVersion後upVersion処理で元の値に戻らないような修正を行と、旧バージョンを保存した際にポインタが指す先が変化してしまいます。
少しややこしいのでまとめます。
1. down/upVersion関数で変更してよい変数<br>
- プリミティブ型(int型やstd::string型)<br>
- enum型<br>
<br>
2. down/upVersion関数で変更しては<b>いけない</b>変数<br>
2-1. ポインタ、および、参照が指す先のインスタンス<br>
2-2. 非侵入型手動クラスの基底クラス、および、メンバ変数<br>
2-3. ポインタそれ自身(ポインタの指す先の変更)<br>
2-1.はシリアライズ対象のインスタンスへ直接アクセスすることになります。<br>
そのため、これらをdown/upVersion関数内で修正した場合、その修正は直接ターゲットが書き換えられてしまいます。そのため、<b>保存時、および、回復処理で回復されなかった変数が変化</b>してしまいます。クラスの「外」にあるインスタンスは書き換えないようにご注意下さい。<br>
なお、2-2.と2-3.については代入演算子(operator=)をprivate定義していますので、変更しようとするとコンパイル・エラーになります。
*/
2 changes: 1 addition & 1 deletion source/document/ja/6.usage_total.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ Theolizerは、バージョンを上げた時に古いクラス定義やenum型
dInstanceを保存/回復します。<br>
ポインタ型を指定した場合は、アドレス回復のためにポイント先のオブジェクト追跡を行います。<br>
他にTHEOLIZER_PROCESS_POINTEE()とTHEOLIZER_PROCESS_OWNER()がありますが、これらについては@ref ObjectTracking で説明します。
他にTHEOLIZER_PROCESS_POINTEE()とTHEOLIZER_PROCESS_OWNER()がありますが、これらについては@ref ObjectTracking で説明します。
<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333; border-radius: 10px; background-color: #d0d0d0;">
このようにシリアライザを問わず、全て同じマクロでシリアライズ処理できます。<br>
Expand Down
8 changes: 4 additions & 4 deletions source/document/ja/7.usage_individual.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@
@page BasicProcess THEOLIZER_PROCESS()の使用例
ここでは、THEOLIZER_PROCESS()による保存/回復の網羅的な使用例(自動テスト)について説明します。<br>
クラスは単純なものを使います。クラスの詳細な使い方は@ref ClassVariation で説明します。<br>
ここではポインタ型とオーナー・ポインタ型の説明と自動テストは行いません。これらについては@ref ObjectTracking で行います。<br>
クラスは単純なものを使います。クラスの詳細な使い方は@ref ClassVariation で説明します。<br>
ここではポインタ型とオーナー・ポインタ型の説明と自動テストは行いません。これらについては@ref ObjectTracking で行います。<br>
<br>
//############################################################################
Expand All @@ -63,7 +63,7 @@ enum型は従来のenum型と、C++11で追加されたscoped enum型の2つ
クラス型はテストを容易にするため、非侵入型完全自動を用いています。<br>
同様にメンバ変数をpublicにしたいのでstructを用いています。<br>
(幾つか制約事項があります。@ref ClassVariation にて説明します。)<br>
(幾つか制約事項があります。@ref ClassVariation にて説明します。)<br>
また、自動テストの記述を簡単化するため、下記を定義しています。
- 初期化用のコンストラクタ
- 比較演算子(operator==)
Expand Down Expand Up @@ -98,7 +98,7 @@ enum型は従来のenum型と、C++11で追加されたscoped enum型の2つ
<br>
- クラス型<br>
ここでは使い方を示すための1種類のみ。細かいテストは@ref ClassVariation にて実施します。<br>
ここでは使い方を示すための1種類のみ。細かいテストは@ref ClassVariation にて実施します。<br>
<br>
- 右辺値(リテラルや式)が保存でき、同じ型の変数へ回復できること<br>
Expand Down
2 changes: 1 addition & 1 deletion source/document/ja/7a.class_variation.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ THEOLIZER_INTRUSIVE()とTHEOLIZER_INTRUSIVE_ORDER()は、最後に<b>private:</b
- <b>dClass</b><br>
自クラス名を指定します。C++はメンバ関数の外クラス定義内で自クラスにアクセスできないため、指定が必要なのです。クラス名の外側に必ず()を付けて下さい。<br>
- <b>dLastVersionNo</b><br>
最新版のバージョン番号は指定します。最初は1を指定して下さい。<br>
最新版のローカル・バージョン番号を指定します。最初は1を指定して下さい。<br>
「@ref ChangingClass 」で使い方を説明します。<br>
<br>
Expand Down
Loading

0 comments on commit d42ad05

Please sign in to comment.