Giraffe+ 0.5.30.477
前リリースからの変化
- OptimizeSelectionがConfig.Separatorを考慮してなかったのを修正
- gc.dllにGC_get_registered_threads_countとGC_dump_dllを定義
- Path.as_Stringを定義
- オブジェクトのスロットを初めて使うときに生成するようにした
- GCにIME等のスレッドが登録されないようにした
- String_arrayとgs::expr_method_arg0をGC_ATOMIC_MALLOCで生成するようにした
- gs::expr::file_nameをgs::symbol_idにした
- タスクトレイのアイコンを管理する非メインスレッドのウインドウにWM_SETTEXTしてメインウインドウと同じことが出来るようにした
- リストボックスのアイテムをAlt+Up/Down(デフォルト設定)で移動できるようにした
- リストボックスのアイテムを入れ替えるGiraffe.ListBox.SwapItems(index1, index2, redraw=true)を定義
- Container.from_Container(container)を定義
- CreateNewFileを第三引数に新ファイル名を受け取れるようにした
- CreateNewFileをディレクトリの指定が無い場合にデスクトップのパスではなく"::"にファイルを作らせることにした
- リストボックスのアイテムをAlt+Delete(デフォルト設定)で削除できるようにした
- Giraffe.ListBox.ResetCountの第一引数を省略可能にした
- Path.to_StringをPath.file_stringと同じにした
- Path.out, inを削除した
- Path.from_StringをPath.=と同じにした
妙に変化項目の数が多いですが、GCの効率化のための作業が多いです。まだまだ出来る限りのことをやっているという状態ではありませんが、全体的に、抽象的な、実装より設計に近い層で、GCの実行効率を考慮してる状況になってきました。
OptimizeSelectionがConfig.Separatorを考慮してなかったのを修正
忘れていたようです。デフォルトでCtrl+Spaceで発動するやつです。
gc.dllにGC_get_registered_threads_countとGC_dump_dllを定義
GCの動作がうさんくさいのでスクリプトから観察できるようにと追加したものです。死んでるスレッドが生きてることになってるとか、そういうのを期待してたんですが、何もありませんでした。対マルチスレッドは健全なようです。
Gc.GC_dump_dllをevalするとGiraffe.exe.logにGCの状態が書き出されます。何がどうなってるのか、いまいち解かりません。
Path.as_Stringを定義
なぜ定義してなかったのか忘れました。boost::pathがそういうキャストオペレータを持ってないからかもしれません。ともかく、あるほうが使い勝手がいいので定義しておきました。動作はPath.to_Stringと同じです。
オブジェクトのスロットを初めて使うときに生成するようにした
結局、ほとんどのものは使わないので。これにより、gs::prototypeのデストラクタを呼ぶ必要もなくなり、ずいぶんGCの効率がよくなったようです。
元々gs::prototypeを直接呼ぶことはほとんどなく、さらにslotも抽象化したことで、Mixinやプライベートスロットのようなものも結構簡単に実現できそうになりました。複雑化したくないので当分やる気はありませんが。
GCにIME等のスレッドが登録されないようにした
DllMainを使った自動登録型ではどうしようも無いわけですが、もうひとつのやり方ではまともに動作しない、ということで、DllMainを使わずに、DllMain型が使っている非ロック型スレッド登録を使うようにしました。マクロとRAIIで簡単に実装してます(gs\gc\thread_registerer.hpp)。
gs::expr::file_nameをgs::symbol_idにした
これまではGCで生成したgs::gstring*でした。そのため、gs::exprの子供をGC_ATOMIC_MALLOCで生成できませんでした。Settingsにより、同じファイルを読み取ることが多いので、GCのことを考えなくても、たぶんこっちのほうが効率よさそうですが。
タスクトレイのアイコンを管理する非メインスレッドのウインドウにWM_SETTEXTしてメインウインドウと同じことが出来るようにした
メインスレッドがビジーなときに横槍を入れられるように、タスクトレイのウインドウは別スレッドにしています。
リストボックスのアイテムをAlt+Up/Down(デフォルト設定)で移動できるようにした
ソートのプライオリティの設定をそのままリストボックス上で出来るようにとやってみたんですが、そのまま上書き保存をキーに割り当てるのが、どうも危険というか、積み重ねをぶち壊すようなのはよくない気がしてやめました。
リストボックスのアイテムを入れ替えるGiraffe.ListBox.SwapItems(index1, index2, redraw=true)を定義
ただ2つを入れ替えるだけです。アイコンや色、マーク状態等、全てのリストアイテムにまつわる項目が移動します。というか、位置という項目のみが入れ替わると考えたほうがいいです。
Container.from_Container(container)を定義
例えば、String.from_Container(\a...\d)とやれば、"abc"が返ります。
CreateNewFileを第三引数に新ファイル名を受け取れるようにした
デフォルトでCtrl+Nで呼び出される関数です。作成に失敗した場合に、新規に入力を求めるのではなく、入力済みのファイル名の編集を求めるようにしました。
CreateNewFileをディレクトリの指定が無い場合にデスクトップのパスではなく"::"にファイルを作らせることにした
抽象的なほうがいいかと。
リストボックスのアイテムをAlt+Delete(デフォルト設定)で削除できるようにした
ただリストボックスから消えるだけです。ファイルの削除とかではありません。
Giraffe.ListBox.ResetCountの第一引数を省略可能にした
省略した場合、内部的な数に合わせることを意味する-1になります。
Path.to_StringをPath.file_stringと同じにした
これまではPath.stringでした。これはboost::pathの対ストリーム出力に合わせたものでした。しかしながら、as_String無しでは使い勝手が悪く、file_stringでなければ動作しないAPIなんかもあり、ついでにas_Stringとto_Stringが一致しないのもよくない、ということでas_Stringを新たに定義し、to_Stringをそれに合わせる、という形になりました。
Path.out, inを削除した
Object.out, inにまかせたほうが一貫性があるみたいなので消しました。これにより、String.out, inがPathのそれになっていた問題も解決しました。
Path.from_StringをPath.=と同じにした
間違ってPath.new(コンストラクタ)と同じにしてました。from_StringはObject.inにより呼ばれる代入です。