• オブジェクトプール

http://www.kmonos.net/alang/boost/classes/pool.html
コンシューマ系で便利に使えそう。
でも次世代、次次世代機になったら、普通にnewとかvectorしちゃったほうが良いんだろうね。


boost全部入れなくてもpoolヘッダだけで使えそうなら早速使おうかと思ったら結構いろいろincludeされてるみたい。

  • any型(Variant型)

http://www.kmonos.net/alang/boost/classes/any.html
これ便利だね!でもtypeinfo使っちゃうのね。
exeをバイナリエディタで見るとクラスシンボルがバリバリ文字列で見えちゃいそう。


ていうか見えてるのあったし。しかもくっそなげぇネームスペースによってexeが1Mぐらい膨らんでたし。それ聞いたときは笑った。

http://www.kmonos.net/alang/boost/classes/spirit.html
これすごいね!
まじでちゃんと動くのか!?

  • グラフ

http://www.kmonos.net/alang/boost/classes/graph.html
某ゲームのマップ解析とか便利かも。これってどのくらい重いんだろうか。
A*より早いとは思えないけど、パスファインドに使ってみようかな。

http://www.kmonos.net/alang/boost/classes/preprocessor.html
なるべく同じコードの繰り返しの記述を簡潔にバグが入り込まないようにと突き詰めると、マクロに到達するよね?しない?するよね?ね?


とにかくプリプロ好きにはたまらない機能です。
でも複雑なマクロを使いすぎるとマクロの定義が分けがわからなくなります。
なにやってんだっけこれ?とかそういうの。
BCBでこんなことやっちゃってるよ自分!
すげーぐっちゃり。
しかも良く見たらこれ、マクロにする必要あんまりないし。
抽象化したクラスでかぶせたらもっとすっきりかけるし。

////////////////////////////////////////////////////////////////////////////////
//
// オプション管理.
//
#include
#pragma hdrstop

#include
#include "Option.h"

#define SAVEMEMBER_ANSISTR(fp,member) \
{\
fprintf(fp,"%s = %s\n",#member,member.c_str());\
}

#define SAVEMEMBER_INT(fp,member) \
{\
fprintf(fp,"%s = %d\n",#member,member);\
}

#define SAVEREGMEMBER_ANSISTR(reg,member) \
reg->WriteString("Option",#member,member )

#define SAVEREGMEMBER_INT(reg,member) \
reg->WriteInteger("Option",#member, member )


#define LOADBEGIN(line,elem)\
line.Trim();\
if ( line.IsEmpty() ) break;\
int dlmCnt = line.LastDelimiter("=");\
elem = line.SubString(dlmCnt+1,line.Length()-(dlmCnt+1)).Trim();\
line = line.SubString(0,dlmCnt-1).Trim();\
if ( !line.AnsiCompareIC("END") ){break;}

#define LOADEND()

#define LOADMEMBER_ANSISTR(line,elem,member) \
else if ( !line.AnsiCompareIC(#member) )\
{member = elem;}

#define LOADMEMBER_INT(line,elem,member) \
else if ( !line.AnsiCompareIC(#member) )\
{member = elem.ToIntDef(0);}


#define LOADREGMEMBER_ANSISTR(reg,member) \
member = reg->ReadString("Option",#member,"" )

#define LOADREGMEMBER_INT(reg,member) \
member = reg->ReadInteger("Option",#member, 0 )


COption::COption()
{
Zero();
LoadReg();
LoadOptionFile( "" );
}

COption::~COption()
{
// デフォルトオプションファイルがあるようなら記録する.
if ( FileExists("option.ini") )
{
SaveOptionFile( "" );
}
SaveReg();
Zero();
}

void COption::Zero(void)
{
m_strToolPath = "";
m_strWorkPath = "";

m_iControlMode = 0;
}

// 任意でファイルの読み書きが出来るようにします.
bool COption::SaveOptionFile( AnsiString filename )
{
// デフォルトiniファイルの設定.
if ( filename.IsEmpty() )
filename = "option.ini";
FILE *fp = fopen(filename.c_str(),"wt");
if ( fp == NULL ) return false;

SAVEMEMBER_ANSISTR( fp, m_strToolPath );
SAVEMEMBER_ANSISTR( fp, m_strWorkPath );
SAVEMEMBER_INT( fp, m_iControlMode );
fclose(fp);
return true;
}

bool COption::LoadOptionFile( AnsiString filename )
{
// デフォルトiniファイルの設定.
if ( filename.IsEmpty() )
filename = "option.ini";

FILE *fp = fopen(filename.c_str(),"rt");
if ( fp == NULL ) return false;

AnsiString line;
AnsiString elem;
char lineBuff[1024];
while ( fgets(lineBuff, 1023, fp) != NULL )
{
line = lineBuff;
LOADBEGIN(line,elem)
LOADMEMBER_ANSISTR( line, elem, m_strToolPath )
LOADMEMBER_ANSISTR( line, elem, m_strWorkPath )
LOADMEMBER_INT( line, elem, m_iControlMode )
LOADEND()
}
fclose(fp);
return true;
}

// レジストリに保存する.
void COption::SaveReg(void)
{
TRegIniFile *Reg = new TRegIniFile("\\Software\\Application");
try
{
SAVEREGMEMBER_ANSISTR( Reg, m_strToolPath );
SAVEREGMEMBER_ANSISTR( Reg, m_strWorkPath );
SAVEREGMEMBER_INT( Reg, m_iControlMode );
}
__finally
{
delete Reg;
}
}

// レジストリから読み込む.
void COption::LoadReg(void)
{
TRegIniFile *Reg = new TRegIniFile("\\Software\\Application");
try
{
LOADREGMEMBER_ANSISTR( Reg, m_strToolPath );
LOADREGMEMBER_ANSISTR( Reg, m_strWorkPath );
LOADREGMEMBER_INT( Reg, m_iControlMode );
}
__finally
{
delete Reg;
}
}