リソースディクショナリ(辞書)クラスハッシュ値をキーとしてリソースを登録したり検索したりできるディクショナリ(辞書)テンプレートクラスです。1.30(バージョンレポートはこちら)ゲーム製作をする上で特にメモリを大量に使用するリソースなどは重複を避けたいところです。リソースディクショナリはリソースに割り振られたハッシュ値をキーとしてリソースをストックします。同様の事はstd::map等のツリーコンテナでもできますが、キーをハッシュ値に限定しインターフェイスも絞って扱いやすくしてあります。このクラスは非参照のリソースを辞書からはずすrefleshメソッドをサポートしています。そのため、登録するリソースクラスは自身の参照カウント数を返すGetRefNumメソッドを持っている必要があります。マルペケのツールクラスであるスマートポインタ(Dix::sp<T>)はGetRefNumメソッドを持っているため、リソースオブジェクトをスマートポインタに包むとこのクラスをすぐに使えます。参照カウンタ数さえ返す仕組みがあれば変換関数を通す事で別のメモリ管理クラスのオブジェクトも辞書に登録可能です。詳しくは下記のリファレンス及びサンプルコードをご覧下さい。このクラスを使うにはDixSmartPtr.hとDixHash32.hが必要です。リソースの参照数によらず辞書をまっさらにします。引数のハッシュ値でリソースが登録されているかをチェックします。このメソッドはチェックするだけで値を返す事はしません。指定のハッシュ値のリソースを取得します。リソースが無い場合はfalseが返されます。第2引数に渡したオブジェクトは変更されません。リソースディクショナリ以外誰も参照していないリソースを辞書から削除(解放)します。Dix::sp<T>を使用している場合はこの段階でリソースはメモリから削除されます。関数を渡すバージョンは、T型のオブジェクトから参照カウンタを算出する方法を提供します。関数の戻り値は保持しているオブジェクトの参照カウンタ数です。詳しくは下記のサンプルコードを参照下さい。辞書にリソースを登録します。ハッシュ値はそのリソースに対して一意である必要があります。同じハッシュ値を持つ別のリソースは登録に失敗し、メソッドはfalseを返します。指定のハッシュ値に対応するリソースを辞書から除きます。削除が成功した段階で辞書はそのリソースの参照をやめますが、リソース自体を削除するわけではありません。よって、そのリソースを参照している他のオブジェクトは引き続きそのリソースを参照し続けられます。"これがイメージデータだと思いねぇ。実際は色データが並ぶんですよ。mainのスタックから消しときます。参照しているのは辞書だけになります。0;}リソースディクショナリは辞書に載せたいオブジェクトをマルペケのスマートポインタに包むと直ぐに使えます。上はImageというイメージクラス(仮)を定義し、それをスマートポインタに包み辞書に登録しています。登録したリソースをgetメソッドで取得し出力するとうまく取得できているはずです。refleshメソッドを呼ぶと辞書が保持している「誰も参照していないリソース」を削除します。いうのは、例えばゲームのあるシーンが終了した後に不必要となったリソースを一括で削除する時に非常に役立ちます。clearメソッドはディクショナリをまっさらにします。これは参照数によらず辞書を完全に初期化します。refleshメソッドと使い分けると便利です。ディクショナリクラスはrefleshメソッド以外は単なるstd::mapと同じ振る舞いをします。refleshメソッド内では保持しているオブジェクトの参照カウンタ数をチェックする必要があるため、デフォルトでマルペケのスマートポインタの持つGetRefNumメソッドを使っています。このメソッドが無いために辞書を使えないのもどうかと思い、refleshメソッドに変換関数を渡せるバージョンも用意しました。上のサンプルの「応用編」以下がその例です。ここではDirectXのオブジェクトの削除管理をするDix::Com_ptrクラスのオブジェクトを辞書に渡しています。Com_ptrクラスはGetRefNumメソッドは持っていませんが、参照カウンタを返すメソッドであるGetRefCntメソッドは持っています(やっちまった感バリバリ(^-^;)。そこでグローバルなGetRefNum関数を用意してrefleshメソッドに渡しています。これでDirectXのオブジェクトもCom_ptrを通して辞書に登録できます!ディクショナリ内部ではstd::mapを使ってリソース管理をしていますが、マップ自体もスマートポインタで包んでいます。このため、ディクショナリを引数に渡してもリソースの大量コピーが発生する事はありません(^-^)。