Theolizer技術解説(2016/09/12) 分割してデータを保存/回復する(保存先指定の巻)
#[[########################################################################### | |
Theolizer紹介用サンプルCMakeLists.txt | |
]]############################################################################ | |
if("${CMAKE_VERSION}" STREQUAL "") | |
set(CMAKE_VERSION, 3.5.0) | |
endif() | |
cmake_minimum_required(VERSION ${CMAKE_VERSION}) | |
message(STATUS "BOOST_ROOT=${BOOST_ROOT}") | |
#----------------------------------------------------------------------------- | |
# プロジェクト設定 | |
#----------------------------------------------------------------------------- | |
set(TARGET_NAME sample) | |
set(SOURCE_LIST main.cpp sub.cpp) | |
set(HEADER_LIST common.h) | |
project(${TARGET_NAME} VERSION 1.0.0) | |
#----------------------------------------------------------------------------- | |
# ビルド設定 | |
#----------------------------------------------------------------------------- | |
# MSVCの通常使わないビルド・モードとZERO_CHECKプロジェクトの削除 | |
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE) | |
set(CMAKE_SUPPRESS_REGENERATION TRUE) | |
# Theolizer | |
find_package(THEOLIZER) | |
# Options | |
if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) | |
add_definitions(-D_UNICODE -DUNICODE) | |
set(CMAKE_DEBUG_POSTFIX "d") | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") | |
else() | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") | |
# MinGWの不具合(https://sourceforge.net/p/mingw-w64/discussion/723797/thread/c6b70624/#7f0a)暫定対処 | |
if((CMAKE_COMPILER_IS_MINGW) AND (CMAKE_SIZEOF_VOID_P EQUAL 8)) | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj") | |
endif() | |
endif() | |
# example | |
add_executable(${TARGET_NAME} ${SOURCE_LIST} ${HEADER_LIST}) | |
setup_theolizer(${TARGET_NAME} StaticWithBoost) | |
#----------------------------------------------------------------------------- | |
# テスト実行 | |
#----------------------------------------------------------------------------- | |
enable_testing() | |
add_test(NAME ${TARGET_NAME} COMMAND $<TARGET_FILE:${TARGET_NAME}>) | |
add_custom_target(BuildTest COMMAND "ctest" "-V" "-C" $<CONFIG>) | |
add_dependencies(BuildTest ${TARGET_NAME}) |
//############################################################################ | |
// Theolizer解説用サンプル・プログラム3 | |
// | |
// 簡単な家計簿用共通定義 | |
//############################################################################ | |
#if !defined(COMMON_H) | |
#define COMMON_H | |
// *************************************************************************** | |
// インクルード | |
// *************************************************************************** | |
// 標準ライブラリ | |
#include <string> | |
// Theolizerライブラリ | |
#include <theolizer/serializer_json.h> | |
#include <theolizer/list.h> | |
// *************************************************************************** | |
// 保存先定義 | |
// *************************************************************************** | |
THEOLIZER_DESTINATIONS | |
( | |
All, // 引き継ぎ元保存先定義の最後のシンボル | |
Settings, // 設定情報 | |
Data // データ | |
); | |
#define SETTINGS THEOLIZER_ANNOTATE(FS:<theolizerD::Settings>) | |
#define DATA THEOLIZER_ANNOTATE(FS:<theolizerD::Data>) | |
#define NO_SAVE THEOLIZER_ANNOTATE(FN) | |
// *************************************************************************** | |
// グローバル・バージョン番号テーブル | |
// *************************************************************************** | |
THEOLIZER_DEFINE_GLOBAL_VERSION_TABLE(GlobalVersionTable, 1); | |
// *************************************************************************** | |
// 構造体定義 | |
// *************************************************************************** | |
#define POINTEE THEOLIZER_ANNOTATE(FS:<>Pointee) | |
//---------------------------------------------------------------------------- | |
// 科目管理 | |
//---------------------------------------------------------------------------- | |
struct Item | |
{ | |
Item* mParent SETTINGS; // 親科目 | |
std::string mName SETTINGS; // 科目名 | |
bool mIsAssets SETTINGS; // 資産(財布や預金) | |
int mAssetsIncrease NO_SAVE; // 増加した資産金額 | |
bool mDoManage SETTINGS; // 残高管理の有無 | |
int mAmount DATA; // 残高 | |
theolizer::ListPointee<Item> mChildren; // 子科目 | |
}; | |
typedef theolizer::ListPointee<Item>::iterator ChildIterator; | |
//---------------------------------------------------------------------------- | |
// 取引記録 | |
//---------------------------------------------------------------------------- | |
struct Date | |
{ | |
short mYear; // 年 | |
char mMonth; // 月(1-12) | |
char mDay; // 日(1-31) | |
}; | |
struct Trade | |
{ | |
Date mDate; // 取引日 | |
Item* mDebitItem; // 購入品(借方科目) | |
int mAmount; // 金額 | |
Item* mCreditItem; // 財布 (貸方科目) | |
std::string mNote; // 備考 | |
}; | |
//---------------------------------------------------------------------------- | |
// 家計簿 | |
//---------------------------------------------------------------------------- | |
struct HouseholdAccounts | |
{ | |
Item mItemTree POINTEE; // 科目ツリー | |
std::list<Trade> mTradeList DATA; // 取引のリスト | |
}; | |
typedef std::list<Trade>::iterator TradeIterator; | |
// *************************************************************************** | |
// 関数群 | |
// *************************************************************************** | |
//---------------------------------------------------------------------------- | |
// 初期設定 | |
//---------------------------------------------------------------------------- | |
void initialize(HouseholdAccounts* oHouseholdAccounts); | |
void display( HouseholdAccounts* iHouseholdAccounts); | |
void calculate( HouseholdAccounts* ioHouseholdAccounts); | |
#endif |
{ | |
"SerialzierName":"JsonTheolizer", | |
"GlobalVersionNo":1, | |
"TypeInfoList":[1] | |
} | |
{ | |
"mItemTree":[1,{ | |
"mAmount":0, | |
"mChildren":[ | |
3, | |
[2,{ | |
"mAmount":0, | |
"mChildren":[ | |
2, | |
[3,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[4,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}], | |
[5,{ | |
"mAmount":0, | |
"mChildren":[ | |
2, | |
[6,{ | |
"mAmount":0, | |
"mChildren":[ | |
2, | |
[7,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[8,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}], | |
[9,{ | |
"mAmount":0, | |
"mChildren":[ | |
3, | |
[10,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[11,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[12,{ | |
"mAmount":0, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}] | |
] | |
}], | |
[13,{ | |
"mAmount":0, | |
"mChildren":[ | |
2, | |
[14,{ | |
"mAmount":35592, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[15,{ | |
"mAmount":147135, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}] | |
] | |
}], | |
"mTradeList":[ | |
10, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":22 | |
}, | |
"mDebitItem":8, | |
"mAmount":158, | |
"mCreditItem":14, | |
"mNote":"六切り1袋" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":22 | |
}, | |
"mDebitItem":10, | |
"mAmount":269, | |
"mCreditItem":14, | |
"mNote":"鶏肉200g" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":22 | |
}, | |
"mDebitItem":11, | |
"mAmount":182, | |
"mCreditItem":14, | |
"mNote":"キャベツ1玉" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":22 | |
}, | |
"mDebitItem":12, | |
"mAmount":113, | |
"mCreditItem":14, | |
"mNote":"バナナ1房" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":22 | |
}, | |
"mDebitItem":15, | |
"mAmount":254536, | |
"mCreditItem":3, | |
"mNote":"セオライド テクノロジー" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":25 | |
}, | |
"mDebitItem":14, | |
"mAmount":50000, | |
"mCreditItem":15, | |
"mNote":"生活費" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":25 | |
}, | |
"mDebitItem":7, | |
"mAmount":4652, | |
"mCreditItem":14, | |
"mNote":"こしひかり10Kg" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":25 | |
}, | |
"mDebitItem":10, | |
"mAmount":685, | |
"mCreditItem":14, | |
"mNote":"豚肉500g" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":25 | |
}, | |
"mDebitItem":11, | |
"mAmount":152, | |
"mCreditItem":14, | |
"mNote":"ほうれん草" | |
}, | |
{ | |
"mDate":{ | |
"mYear":2016, | |
"mMonth":8, | |
"mDay":25 | |
}, | |
"mDebitItem":11, | |
"mAmount":136, | |
"mCreditItem":14, | |
"mNote":"人参" | |
} | |
] | |
} |
//############################################################################ | |
// Theolizer解説用サンプル・プログラム3 | |
// | |
// メイン処理(データ保存/回復サンプル) | |
//############################################################################ | |
#define THEOLIZER_GLOBAL_VERSION_TABLE | |
// *************************************************************************** | |
// インクルード | |
// *************************************************************************** | |
// 標準ライブラリ | |
#include <iostream> | |
#include <fstream> | |
// 共通定義 | |
#include "common.h" | |
// Theolizer自動生成先 | |
#include "main.cpp.theolizer.hpp" | |
// *************************************************************************** | |
// メイン | |
// *************************************************************************** | |
int main(int argc, char* argv[]) | |
{ | |
//---------------------------------------------------------------------------- | |
// バラメータ解析 | |
//---------------------------------------------------------------------------- | |
std::string aSufix=""; | |
if (1 < argc) | |
{ | |
aSufix=argv[1]; | |
} | |
std::cout << theolizer::print("Sufix=%s\n", aSufix); | |
std::string aSettings = theolizer::print("Settings%s.json", aSufix).str(); | |
std::string aData = theolizer::print("Data%s.json", aSufix).str(); | |
//---------------------------------------------------------------------------- | |
// 家計簿設定 | |
//---------------------------------------------------------------------------- | |
// サフィックス指定されたら回復処理のみ実行する | |
if (aSufix == "") | |
{ | |
// 保存用家計簿 | |
HouseholdAccounts aHouseholdAccountsSave; | |
// 初期設定(科目と取引データを設定している) | |
initialize(&aHouseholdAccountsSave); | |
//---------------------------------------------------------------------------- | |
// 保存 | |
//---------------------------------------------------------------------------- | |
std::cout << u8"<<< 保存するサンプル・データ >>>\n"; | |
display(&aHouseholdAccountsSave); | |
// 保存処理(Settings) | |
{ | |
// 保存先のファイルをオープンする | |
std::ofstream aStream(aSettings); | |
// シリアライザを用意する | |
theolizer::JsonOSerializer<theolizerD::Settings> js(aStream); | |
// 家計簿をSettings.jsonファイルへ保存する | |
THEOLIZER_PROCESS(js, aHouseholdAccountsSave); | |
// オブジェクト追跡の締め | |
js.clearTracking(); | |
} | |
// 保存処理(Data) | |
{ | |
// 保存先のファイルをオープンする | |
std::ofstream aStream(aData); | |
// シリアライザを用意する | |
theolizer::JsonOSerializer<theolizerD::Data> js(aStream); | |
// 家計簿をData.jsonファイルへ保存する | |
THEOLIZER_PROCESS(js, aHouseholdAccountsSave); | |
// オブジェクト追跡の締め | |
js.clearTracking(); | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 回復 | |
//---------------------------------------------------------------------------- | |
// 回復用家計簿(正確に回復できていることを示すため、保存用と別領域) | |
HouseholdAccounts aHouseholdAccountsLoad; | |
// 回復処理(Settings) | |
{ | |
// 回復元のファイルをオープンする | |
std::ifstream aStream(aSettings); | |
// シリアライザを用意する | |
theolizer::JsonISerializer<theolizerD::Settings> js(aStream); | |
// 家計簿をSettings.jsonファイルから回復する | |
THEOLIZER_PROCESS(js, aHouseholdAccountsLoad); | |
// オブジェクト追跡の締め | |
js.clearTracking(); | |
} | |
// 回復処理(Data) | |
{ | |
// 回復元のファイルをオープンする | |
std::ifstream aStream(aData); | |
// シリアライザを用意する | |
theolizer::JsonISerializer<theolizerD::Data> js(aStream); | |
// 家計簿をData.jsonファイルから回復する | |
THEOLIZER_PROCESS(js, aHouseholdAccountsLoad); | |
// オブジェクト追跡の締め | |
js.clearTracking(); | |
} | |
//---------------------------------------------------------------------------- | |
// 内容表示と簡単な集計処理 | |
//---------------------------------------------------------------------------- | |
std::cout << u8"\n\n<<< 回復したサンプル・データ >>>\n"; | |
display(&aHouseholdAccountsLoad); | |
std::cout << u8"\n\n<<< サンプルの集計結果 >>>\n"; | |
calculate(&aHouseholdAccountsLoad); | |
return 0; | |
} |
#ifdef THEOLIZER_WRITE_CODE // ###### Item ###### | |
#define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1) | |
#define THEOLIZER_GENERATED_FULL_AUTO Item | |
// ---<<< Version.1 >>>--- | |
#define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1) | |
#define THEOLIZER_GENERATED_CLASS_NAME()\ | |
THEOLIZER_INTERNAL_CLASS_NAME((u8"Item")) | |
#define THEOLIZER_GENERATED_ELEMENT_MAP emName | |
#define THEOLIZER_GENERATED_ELEMENT_LIST()\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mParent),mParent,etmDefault,\ | |
(theolizerD::Settings),\ | |
(Item *))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mName),mName,etmDefault,\ | |
(theolizerD::Settings),\ | |
(std::string))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mIsAssets),mIsAssets,etmDefault,\ | |
(theolizerD::Settings),\ | |
(bool))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mDoManage),mDoManage,etmDefault,\ | |
(theolizerD::Settings),\ | |
(bool))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mAmount),mAmount,etmDefault,\ | |
(theolizerD::Data),\ | |
(int))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mChildren),mChildren,etmDefault,\ | |
(theolizerD::All),\ | |
(theolizer::ListPointee<Item>)) | |
#include <theolizer/internal/version_auto.inc> | |
#undef THEOLIZER_GENERATED_VERSION_NO | |
#endif//THEOLIZER_WRITE_CODE // ###### Item ###### | |
#ifdef THEOLIZER_WRITE_CODE // ###### Date ###### | |
#define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1) | |
#define THEOLIZER_GENERATED_FULL_AUTO Date | |
// ---<<< Version.1 >>>--- | |
#define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1) | |
#define THEOLIZER_GENERATED_CLASS_NAME()\ | |
THEOLIZER_INTERNAL_CLASS_NAME((u8"Date")) | |
#define THEOLIZER_GENERATED_ELEMENT_MAP emName | |
#define THEOLIZER_GENERATED_ELEMENT_LIST()\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mYear),mYear,etmDefault,\ | |
(theolizerD::All),\ | |
(short))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mMonth),mMonth,etmDefault,\ | |
(theolizerD::All),\ | |
(char))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mDay),mDay,etmDefault,\ | |
(theolizerD::All),\ | |
(char)) | |
#include <theolizer/internal/version_auto.inc> | |
#undef THEOLIZER_GENERATED_VERSION_NO | |
#endif//THEOLIZER_WRITE_CODE // ###### Date ###### | |
#ifdef THEOLIZER_WRITE_CODE // ###### Trade ###### | |
#define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1) | |
#define THEOLIZER_GENERATED_FULL_AUTO Trade | |
// ---<<< Version.1 >>>--- | |
#define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1) | |
#define THEOLIZER_GENERATED_CLASS_NAME()\ | |
THEOLIZER_INTERNAL_CLASS_NAME((u8"Trade")) | |
#define THEOLIZER_GENERATED_ELEMENT_MAP emName | |
#define THEOLIZER_GENERATED_ELEMENT_LIST()\ | |
THEOLIZER_INTERNAL_ELEMENT_KN((mDate),mDate,etmDefault,\ | |
(theolizerD::All),\ | |
(Date),1)\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mDebitItem),mDebitItem,etmDefault,\ | |
(theolizerD::All),\ | |
(Item *))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mAmount),mAmount,etmDefault,\ | |
(theolizerD::All),\ | |
(int))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mCreditItem),mCreditItem,etmDefault,\ | |
(theolizerD::All),\ | |
(Item *))\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mNote),mNote,etmDefault,\ | |
(theolizerD::All),\ | |
(std::string)) | |
#include <theolizer/internal/version_auto.inc> | |
#undef THEOLIZER_GENERATED_VERSION_NO | |
#endif//THEOLIZER_WRITE_CODE // ###### Trade ###### | |
#ifdef THEOLIZER_WRITE_CODE // ###### HouseholdAccounts ###### | |
#define THEOLIZER_GENERATED_LAST_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kLastVersionNo,1) | |
#define THEOLIZER_GENERATED_FULL_AUTO HouseholdAccounts | |
// ---<<< Version.1 >>>--- | |
#define THEOLIZER_GENERATED_VERSION_NO THEOLIZER_INTERNAL_DEFINE(kVersionNo,1) | |
#define THEOLIZER_GENERATED_CLASS_NAME()\ | |
THEOLIZER_INTERNAL_CLASS_NAME((u8"HouseholdAccounts")) | |
#define THEOLIZER_GENERATED_ELEMENT_MAP emName | |
#define THEOLIZER_GENERATED_ELEMENT_LIST()\ | |
THEOLIZER_INTERNAL_ELEMENT_KN((mItemTree),mItemTree,etmPointee,\ | |
(theolizerD::All),\ | |
(Item),1)\ | |
THEOLIZER_INTERNAL_ELEMENT_N((mTradeList),mTradeList,etmDefault,\ | |
(theolizerD::Data),\ | |
(std::list<Trade>)) | |
#include <theolizer/internal/version_auto.inc> | |
#undef THEOLIZER_GENERATED_VERSION_NO | |
#endif//THEOLIZER_WRITE_CODE // ###### HouseholdAccounts ###### | |
#ifdef THEOLIZER_WRITE_CODE // ###### Global VersionNo. Table ###### | |
namespace theolizer{namespace internal{ | |
namespace global_table{ | |
GlobalVersionTable::GlobalVersionTable() | |
{ | |
THEOLIZER_INTERNAL_ADD(theolizer::internal::JsonMidOSerializer,1u); | |
THEOLIZER_INTERNAL_ADD(theolizer::internal::JsonMidISerializer,1u); | |
THEOLIZER_INTERNAL_ADD(pairTheolizer,1u); | |
THEOLIZER_INTERNAL_ADD(listTheolizer,1u); | |
THEOLIZER_INTERNAL_ADD(ListPointeeTheolizer,1u); | |
} | |
} // namespace global_table | |
}} // namespace theolizer | |
#endif//THEOLIZER_WRITE_CODE // ###### Global VersionNo. Table ###### |
Sufix= | |
<<< 保存するサンプル・データ >>> | |
--- 科目 --- | |
家計 | |
収入 | |
給料 | |
雑収入 | |
支出 | |
主食 | |
お米 | |
パン | |
副食 | |
肉魚 | |
野菜 | |
果物 | |
現金 | |
財布 残高:35592 | |
預金 残高:147135 | |
--- 取引 --- | |
2016/08/22 家計/支出/主食/パン <- 家計/現金/財布( 158) : 六切り1袋 | |
2016/08/22 家計/支出/副食/肉魚 <- 家計/現金/財布( 269) : 鶏肉200g | |
2016/08/22 家計/支出/副食/野菜 <- 家計/現金/財布( 182) : キャベツ1玉 | |
2016/08/22 家計/支出/副食/果物 <- 家計/現金/財布( 113) : バナナ1房 | |
2016/08/22 家計/現金/預金 <- 家計/収入/給料(254536) : セオライド テクノロジー | |
2016/08/25 家計/現金/財布 <- 家計/現金/預金( 50000) : 生活費 | |
2016/08/25 家計/支出/主食/お米 <- 家計/現金/財布( 4652) : こしひかり10Kg | |
2016/08/25 家計/支出/副食/肉魚 <- 家計/現金/財布( 685) : 豚肉500g | |
2016/08/25 家計/支出/副食/野菜 <- 家計/現金/財布( 152) : ほうれん草 | |
2016/08/25 家計/支出/副食/野菜 <- 家計/現金/財布( 136) : 人参 | |
<<< 回復したサンプル・データ >>> | |
--- 科目 --- | |
家計 | |
収入 | |
給料 | |
雑収入 | |
支出 | |
主食 | |
お米 | |
パン | |
副食 | |
肉魚 | |
野菜 | |
果物 | |
現金 | |
財布 残高:35592 | |
預金 残高:147135 | |
--- 取引 --- | |
2016/08/22 家計/支出/主食/パン <- 家計/現金/財布( 158) : 六切り1袋 | |
2016/08/22 家計/支出/副食/肉魚 <- 家計/現金/財布( 269) : 鶏肉200g | |
2016/08/22 家計/支出/副食/野菜 <- 家計/現金/財布( 182) : キャベツ1玉 | |
2016/08/22 家計/支出/副食/果物 <- 家計/現金/財布( 113) : バナナ1房 | |
2016/08/22 家計/現金/預金 <- 家計/収入/給料(254536) : セオライド テクノロジー | |
2016/08/25 家計/現金/財布 <- 家計/現金/預金( 50000) : 生活費 | |
2016/08/25 家計/支出/主食/お米 <- 家計/現金/財布( 4652) : こしひかり10Kg | |
2016/08/25 家計/支出/副食/肉魚 <- 家計/現金/財布( 685) : 豚肉500g | |
2016/08/25 家計/支出/副食/野菜 <- 家計/現金/財布( 152) : ほうれん草 | |
2016/08/25 家計/支出/副食/野菜 <- 家計/現金/財布( 136) : 人参 | |
<<< サンプルの集計結果 >>> | |
家計 : 0円の収入 | |
家計/収入 : 254536円の収入 | |
家計/収入/給料 : 254536円の収入 | |
家計/収入/雑収入 : 0円の収入 | |
家計/支出 : 6347円の消費 | |
家計/支出/主食 : 4810円の消費 | |
家計/支出/主食/お米 : 4652円の消費 | |
家計/支出/主食/パン : 158円の消費 | |
家計/支出/副食 : 1537円の消費 | |
家計/支出/副食/肉魚 : 954円の消費 | |
家計/支出/副食/野菜 : 470円の消費 | |
家計/支出/副食/果物 : 113円の消費 | |
家計/現金 : 248189円の増加 | |
家計/現金/財布 : 43653円の増加 残高は 79245円 | |
家計/現金/預金 : 204536円の増加 残高は351671円 |
{ | |
"SerialzierName":"JsonTheolizer", | |
"GlobalVersionNo":1, | |
"TypeInfoList":[1] | |
} | |
{ | |
"mItemTree":[1,{ | |
"mParent":0, | |
"mName":"家計", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
3, | |
[2,{ | |
"mParent":1, | |
"mName":"収入", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
2, | |
[3,{ | |
"mParent":2, | |
"mName":"給料", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[4,{ | |
"mParent":2, | |
"mName":"雑収入", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}], | |
[5,{ | |
"mParent":1, | |
"mName":"支出", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
2, | |
[6,{ | |
"mParent":5, | |
"mName":"主食", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
2, | |
[7,{ | |
"mParent":6, | |
"mName":"お米", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[8,{ | |
"mParent":6, | |
"mName":"パン", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}], | |
[9,{ | |
"mParent":5, | |
"mName":"副食", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
3, | |
[10,{ | |
"mParent":9, | |
"mName":"肉魚", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[11,{ | |
"mParent":9, | |
"mName":"野菜", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[12,{ | |
"mParent":9, | |
"mName":"果物", | |
"mIsAssets":0, | |
"mDoManage":0, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}] | |
] | |
}], | |
[13,{ | |
"mParent":1, | |
"mName":"現金", | |
"mIsAssets":1, | |
"mDoManage":0, | |
"mChildren":[ | |
2, | |
[14,{ | |
"mParent":13, | |
"mName":"財布", | |
"mIsAssets":1, | |
"mDoManage":1, | |
"mChildren":[ | |
0 | |
] | |
}], | |
[15,{ | |
"mParent":13, | |
"mName":"預金", | |
"mIsAssets":1, | |
"mDoManage":1, | |
"mChildren":[ | |
0 | |
] | |
}] | |
] | |
}] | |
] | |
}] | |
} |
//############################################################################ | |
// Theolizer解説用サンプル・プログラム3(2と同じもの) | |
// | |
// 補助関数群(家計簿にサンプル・データ設定/表示) | |
//############################################################################ | |
// *************************************************************************** | |
// インクルード | |
// *************************************************************************** | |
// 標準ライブラリ | |
#include <iostream> | |
#include <fstream> | |
// 共通定義 | |
#include "common.h" | |
// *************************************************************************** | |
// 家計簿にサンプル・データ設定 | |
// *************************************************************************** | |
//---------------------------------------------------------------------------- | |
// find 科目 | |
//---------------------------------------------------------------------------- | |
Item* find(Item* iItem, char const* iItemName) | |
{ | |
if (iItem->mName == iItemName) | |
return iItem; | |
for (ChildIterator itr=iItem->mChildren.begin(); itr != iItem->mChildren.end(); ++itr) | |
{ | |
Item* ret=find(&(*itr), iItemName); | |
if (ret) | |
return ret; | |
} | |
return NULL; | |
} | |
//---------------------------------------------------------------------------- | |
// 科目ツリー設定 | |
// 家計 | |
// 収入 | |
// 給料 | |
// 雑収入 | |
// 支出 | |
// 食費 | |
// 主食 | |
// お米 | |
// パン | |
// 副食 | |
// 肉魚 | |
// 野菜 | |
// 果物 | |
// 現金 | |
// 財布 | |
// 預金 | |
//---------------------------------------------------------------------------- | |
// ---<<< 子科目設定 >>>--- | |
Item* pushItem | |
( | |
Item* oItem, | |
char const* iItemName, | |
bool iIsAssets=false, | |
bool iDoManage=false, | |
int iAmount=0 | |
) | |
{ | |
Item aItem; | |
aItem.mParent =oItem; | |
aItem.mName =iItemName; | |
aItem.mIsAssets =iIsAssets; | |
aItem.mAssetsIncrease =0; | |
aItem.mDoManage =iDoManage; | |
aItem.mAmount =iAmount; | |
oItem->mChildren.push_back(aItem); | |
return &(oItem->mChildren.back()); | |
} | |
// ---<<< 科目ツリー設定 >>>--- | |
void makeItems(Item* oItemTree) | |
{ | |
oItemTree->mParent =NULL; | |
oItemTree->mName =u8"家計"; | |
oItemTree->mIsAssets=false; | |
oItemTree->mDoManage=false; | |
oItemTree->mAmount =0; | |
Item* aLayer0=oItemTree; | |
{ | |
Item* aLayer1; | |
aLayer1=pushItem(aLayer0, u8"収入"); | |
{ | |
pushItem(aLayer1, u8"給料"); | |
pushItem(aLayer1, u8"雑収入"); | |
} | |
aLayer1=pushItem(aLayer0, u8"支出"); | |
{ | |
Item* aLayer2; | |
aLayer2=pushItem(aLayer1, u8"主食"); | |
{ | |
pushItem(aLayer2, u8"お米"); | |
pushItem(aLayer2, u8"パン"); | |
} | |
aLayer2=pushItem(aLayer1, u8"副食"); | |
{ | |
pushItem(aLayer2, u8"肉魚"); | |
pushItem(aLayer2, u8"野菜"); | |
pushItem(aLayer2, u8"果物"); | |
} | |
} | |
aLayer1=pushItem(aLayer0, u8"現金", true); | |
{ | |
pushItem(aLayer1, u8"財布", true, true, 35592); | |
pushItem(aLayer1, u8"預金", true, true, 147135); | |
} | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 取引リスト設定 | |
//---------------------------------------------------------------------------- | |
// ---<<< 取引設定サブ >>>--- | |
bool pushTrade | |
( | |
HouseholdAccounts* oHA, | |
short iYear, | |
char iMonth, | |
char iDay, | |
char const* iDebitName, | |
int iAmount, | |
char const* iCreditName, | |
char const* iNote | |
) | |
{ | |
Trade aTrade; | |
aTrade.mDate.mYear = iYear; | |
aTrade.mDate.mMonth = iMonth; | |
aTrade.mDate.mDay = iDay; | |
aTrade.mDebitItem = find(&(oHA->mItemTree), iDebitName); | |
aTrade.mAmount = iAmount; | |
aTrade.mCreditItem = find(&(oHA->mItemTree), iCreditName); | |
aTrade.mNote = iNote; | |
if (aTrade.mDebitItem == NULL) | |
{ | |
std::cerr << theolizer::print(u8"商品名(%s)が不正です。", iDebitName) << std::endl; | |
return false; | |
} | |
if (aTrade.mCreditItem == NULL) | |
{ | |
std::cerr << theolizer::print(u8"商品名(%s)が不正です。", iCreditName) << std::endl; | |
return false; | |
} | |
oHA->mTradeList.push_back(aTrade); | |
return true; | |
} | |
// ---<<< 取引リスト設定 >>>--- | |
void makeTrades(HouseholdAccounts* oHA) | |
{ | |
pushTrade(oHA, 2016, 8,22, u8"パン", 158, u8"財布", u8"六切り1袋"); | |
pushTrade(oHA, 2016, 8,22, u8"肉魚", 269, u8"財布", u8"鶏肉200g"); | |
pushTrade(oHA, 2016, 8,22, u8"野菜", 182, u8"財布", u8"キャベツ1玉"); | |
pushTrade(oHA, 2016, 8,22, u8"果物", 113, u8"財布", u8"バナナ1房"); | |
pushTrade(oHA, 2016, 8,22, u8"預金", 254536, u8"給料", u8"セオライド テクノロジー"); | |
pushTrade(oHA, 2016, 8,25, u8"財布", 50000, u8"預金", u8"生活費"); | |
pushTrade(oHA, 2016, 8,25, u8"お米", 4652, u8"財布", u8"こしひかり10Kg"); | |
pushTrade(oHA, 2016, 8,25, u8"肉魚", 685, u8"財布", u8"豚肉500g"); | |
pushTrade(oHA, 2016, 8,25, u8"野菜", 152, u8"財布", u8"ほうれん草"); | |
pushTrade(oHA, 2016, 8,25, u8"野菜", 136, u8"財布", u8"人参"); | |
} | |
//---------------------------------------------------------------------------- | |
// 設定 | |
//---------------------------------------------------------------------------- | |
void initialize(HouseholdAccounts* oHouseholdAccounts) | |
{ | |
makeItems(&(oHouseholdAccounts->mItemTree)); | |
makeTrades(oHouseholdAccounts); | |
} | |
// *************************************************************************** | |
// 家計簿表示 | |
// *************************************************************************** | |
//---------------------------------------------------------------------------- | |
// 科目名結合 | |
//---------------------------------------------------------------------------- | |
std::string getFullName(Item* iItem) | |
{ | |
if (iItem->mParent != NULL) | |
{ | |
return getFullName(iItem->mParent) + "/" + iItem->mName; | |
} | |
else | |
{ | |
return iItem->mName; | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 科目表示 | |
//---------------------------------------------------------------------------- | |
void displayItems(int iIndent, Item* iItem) | |
{ | |
std::cout << std::string(iIndent*2, ' ') << iItem->mName; | |
if (iItem->mDoManage) | |
{ | |
std::cout << u8" 残高:" << iItem->mAmount; | |
} | |
std::cout << "\n"; | |
for (ChildIterator itr=iItem->mChildren.begin(); itr != iItem->mChildren.end(); ++itr) | |
{ | |
displayItems(iIndent+1, &(*itr)); | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 取引表示 | |
//---------------------------------------------------------------------------- | |
void displayTrades(HouseholdAccounts* iHA) | |
{ | |
for (TradeIterator itr=iHA->mTradeList.begin(); itr != iHA->mTradeList.end(); ++itr) | |
{ | |
std::cout << theolizer::print("%04d/%02d/%02d %s <- %s(%6d) : %s\n", | |
itr->mDate.mYear, | |
itr->mDate.mMonth+0, | |
itr->mDate.mDay+0, | |
getFullName(itr->mDebitItem), | |
getFullName(itr->mCreditItem), | |
itr->mAmount, | |
itr->mNote); | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 全体表示 | |
//---------------------------------------------------------------------------- | |
void display(HouseholdAccounts* iHouseholdAccounts) | |
{ | |
std::cout << u8"--- 科目 ---\n"; | |
displayItems(0, &(iHouseholdAccounts->mItemTree)); | |
std::cout << u8"\n--- 取引 ---\n"; | |
displayTrades(iHouseholdAccounts); | |
} | |
// *************************************************************************** | |
// 家計簿処理と結果表示 | |
// *************************************************************************** | |
//---------------------------------------------------------------------------- | |
// 初期化 | |
//---------------------------------------------------------------------------- | |
void clearIncrease(Item* iItem) | |
{ | |
iItem->mAssetsIncrease=0; | |
for (ChildIterator itr=iItem->mChildren.begin(); itr != iItem->mChildren.end(); ++itr) | |
{ | |
clearIncrease(&(*itr)); | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 結果表示 | |
//---------------------------------------------------------------------------- | |
void displayAmount(Item* iItem) | |
{ | |
std::cout << getFullName(iItem); | |
if (iItem->mIsAssets) | |
{ | |
if (0 <= iItem->mAssetsIncrease) | |
{ | |
std::cout << theolizer::print(u8" : %6d円の増加", iItem->mAssetsIncrease); | |
} | |
else | |
{ | |
std::cout << theolizer::print(u8" : %6d円の減少", -iItem->mAssetsIncrease); | |
} | |
} | |
else | |
{ | |
if (0 <= iItem->mAssetsIncrease) | |
{ | |
std::cout << theolizer::print(u8" : %6d円の収入", iItem->mAssetsIncrease); | |
} | |
else | |
{ | |
std::cout << theolizer::print(u8" : %6d円の消費", -iItem->mAssetsIncrease); | |
} | |
} | |
if (iItem->mDoManage) | |
{ | |
std::cout << theolizer::print(u8" 残高は%6d円\n", iItem->mAmount); | |
} | |
else | |
{ | |
std::cout << "\n"; | |
} | |
for (ChildIterator itr=iItem->mChildren.begin(); itr != iItem->mChildren.end(); ++itr) | |
{ | |
displayAmount(&(*itr)); | |
} | |
} | |
//---------------------------------------------------------------------------- | |
// 計算 | |
//---------------------------------------------------------------------------- | |
void calculate(HouseholdAccounts* ioHouseholdAccounts) | |
{ | |
// 初期化 | |
clearIncrease(&(ioHouseholdAccounts->mItemTree)); | |
// 集計 | |
for (TradeIterator itr=ioHouseholdAccounts->mTradeList.begin(); | |
itr != ioHouseholdAccounts->mTradeList.end(); | |
++itr) | |
{ | |
// ---<<< 増減処理 >>>--- | |
// 借方の資産は増える/借方の非資産は減る | |
for (Item* p=itr->mDebitItem; p != NULL; p=p->mParent) | |
{ | |
if (p->mIsAssets) | |
{ | |
p->mAssetsIncrease += itr->mAmount; | |
} | |
else | |
{ | |
p->mAssetsIncrease -= itr->mAmount; | |
} | |
} | |
// 貸方の資産は減る/借方の非資産は増える | |
for (Item* p=itr->mCreditItem; p != NULL; p=p->mParent) | |
{ | |
if (p->mIsAssets) | |
{ | |
p->mAssetsIncrease -= itr->mAmount; | |
} | |
else | |
{ | |
p->mAssetsIncrease += itr->mAmount; | |
} | |
} | |
// ---<<< 残高処理 >>>--- | |
// 借方 | |
if (itr->mDebitItem->mDoManage) | |
{ | |
itr->mDebitItem->mAmount += itr->mAmount; | |
} | |
// 貸方 | |
if (itr->mCreditItem->mDoManage) | |
{ | |
itr->mCreditItem->mAmount -= itr->mAmount; | |
} | |
} | |
displayAmount(&(ioHouseholdAccounts->mItemTree)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment