Giraffe+ 0.5.21.353
前リリースからの変化
- std::copyをContainer.copy_intoとして定義
- Istream.getをObject.getのオーバーロードとして再定義
- Istream_iterator, Istream_line_iterator, Ostream_iteratorを定義
- Istream.begin, endをIstream_iteratorを返すメソッドとして定義
- Istream.lbegin, lendをIstream_line_iteratorを返すメソッドとして定義
- Ostream.obeginをOstream_iteratorを返すメソッドとして定義
- Back_insert_iterator, Front_insert_iterator, Insert_iteratorを定義
- Container.obeginを引数無しの場合はBack_insert_iterator、有りの場合はInsert_iteratorを返すメソッドとして定義
- IosをContainerの子とした
- Container.lrangeをself.lbeginとself.lendによるレンジを返すメソッドとして定義
- 暗黙の型変換の仕様をまた少し変えて、ポインタからポインタの変換時にポインティの継承関係を扱えるようにした
- パース時に__LINE__と__COLUMN__をそれぞれファイルの行と列に置き換えるようにした
- 内部の式クラスにそれが定義されたファイル名と行と列を保持するようにした
- Object.scopeを引数の関数にselfを渡して実行後にself.closeするメソッドとして定義
- Block.checkをself.evalの戻り値がfalseの場合にself.to_String.flush(Dout)するメソッドとして定義
- Block.assertをself.evalの戻り値がfalseの場合にself.to_Stringを表示する例外を投げるメソッドとして定義
- スクリプト実行のエラーダイアログを、エラーのあったスクリプトを開けるものにした
std::copyをContainer.copy_intoとして定義
いろいろイテレータが使えるようになってきたので。
Istream_iterator, Istream_line_iterator, Ostream_iteratorを定義
Istream_iterator、Ostream_iteratorともに扱うのは文字です。std::(i|o)stream_iterator
Istream.begin, endをIstream_iteratorを返すメソッドとして定義
これでIfstream.eachでファイルを一文字ずつeachできるようになりました。
Istream.lbegin, lendをIstream_line_iteratorを返すメソッドとして定義
これでIfstream.lrange.eachでファイルを一行ずつeachできるようになりました。
Back_insert_iterator, Front_insert_iterator, Insert_iteratorを定義
それぞれ、push_back, push_front, insertをcallするものです。
Container.obeginを引数無しの場合はBack_insert_iterator、有りの場合はInsert_iteratorを返すメソッドとして定義
std::copyはこれらが無いと使い物にならないので。
IosをContainerの子とした
これにより全てのStreamがeachやlrangeを得ます。
Container.lrangeをself.lbeginとself.lendによるレンジを返すメソッドとして定義
self.lbegin...(self.lend)と全く同じです。
暗黙の型変換の仕様をまた少し変えて、ポインタからポインタの変換時にポインティの継承関係を扱えるようにした
これまでの仕様だと、Cout.rdbuf(Stringstream.rdbuf)みたいなのが出来ませんでした。
パース時に__LINE__と__COLUMN__をそれぞれファイルの行と列に置き換えるようにした
__FILE__と同じです。型はUint(size_t)です。exprが保持するようになったので、別にパース時に置き換える必要は無いんですが、まあ、そういうものなので。
内部の式クラスにそれが定義されたファイル名と行と列を保持するようにした
スクリプトから参照する手段は今のところありません。exprのラッパーであるBlockオブジェクトからアクセスできるようにしてもいいのですが、exprの仕様がもっと固まってからです。
これの実装のためにBoost.Spiritに用意されてるposition_iteratorを少しいじったものを使いました。それに伴い、ノード生成ポリシーをnode_val_dataからnode_iter_dataに変更した結果、パーサが倍速ぐらいになりました。起動時やイベントメニューなど、いろんな部分でボトルネックとなる部分だったので、ずっと高速化したかったわけですが、ノード生成に関しては全く意識してませんでした。
Object.scopeを引数の関数にselfを渡して実行後にself.closeするメソッドとして定義
これで、
Ifstream.new(filepath).scope& `f[ f.lrange.each& `line[ //行ごとの処理 ] ]
とできるようになりました。self.closeはRAIIで呼ばれるので、スコープ内で例外等が飛んでも実行されます。
Block.checkをself.evalの戻り値がfalseの場合にself.to_String.flush(Dout)するメソッドとして定義
exprにファイル位置が保持されるようになったので、使い物になるかと。
Block.assertをself.evalの戻り値がfalseの場合にself.to_Stringを表示する例外を投げるメソッドとして定義
Block.checkとの違いは、処理を続けるかどうかです。