RAIIをやりやすく。
気が付けば解放保証人みたいな扱い。
そしてそれすらにもなっていないことに気付く。
リソース管理とデストラクタとGCのメモリ回収がごっちゃになってるんだなぁ。
typedef RaiiException;
abstract class Raii;
RAII基盤
Killメソッドを実装すれば後は自殺するだけさ。
あくまでデストラクタ時にKill()しようとするだけであってGCに一任するものじゃないよ。
protected bool Suicide;
protected abstract void Kill();
final bool kill();
手軽に自殺。
呼び出した後にRaii.Suicideはfalseに設定される。
Suicideの内容は判定されない。
- Returns:
- 自殺と判定された場合はtrue、自殺に見せかけた他殺とか自殺未遂ならfalseを返す。
const final bool suicide();
身辺整理フラグ。
- Returns:
- 準備できているならtrue、まだならfalseを返す。
abstract interface IRaii;
Raiiを強制。
protected abstract void Kill();
template MixInKillResource(alias ResourceName,alias ResourceHandle,alias KillFunc,alias KillFuncFailValue)
リソースハンドル削除用テンプレート。
限られた用途に限り有効。
- Params:
- ResourceName
- リソース名@直接は関係なし。
- ResourceHandle
- 解放すべきリソースハンドル。
- KillFunc
- ResourceHandleを引数として受け取る処理。
成功すると(未実装のKillFuncFailで判定)ResourceHandleはResourceHandle.initが代入される。
- KillFuncFail
- KillFuncの失敗値。
class HandleRaiiException: etc.negui.system.exception.NeGuiException;
class HandleRaii: etc.negui.system.raii.Raii, etc.negui.system.raii.IHandle;
ハンドルオブジェクト専用RAII。
Windowsで大活躍のHANDLEをサポートするけど作ったのがnemuxi.drawを作った後だったので足枷。
protected HANDLE Handle;
this(HANDLE Handle
, bool Suicide
);
コンストラクタ。
- Params:
- HANDLE Handle
- 設定するハンドル。
- bool Suicide
- 死亡フラグ。
template MixInHandleRaiiClass()
HandleRaiiのコンストラクタ統一。
class SuperHandle: HandleRaii, IRaii {
mixin HandleRaiiClass;
override void Kill() {
del(Handle);
}
}
class ExHandle: SuperHandle {
mixin HandleRaiiClass;
}
auto ex = ExHandle(handle, true);
abstract interface IInitialize;
初期化が必要。
abstract void initialize();