2014-07-12-01-CL-STLとNGL - project-enigma

2014-07-12-01-CL-STLとNGL

>> Site top >> weblog >> 月別アーカイブ >> 2014年07月のlog >> 2014-07-12-01-CL-STLとNGL

最終更新日付:2014/07/12 23:50:00


CL-STLとNGL

2014 年 07 月 12 日

休みに入ったら入ったで、色々忙しい。今日は CL-STL の現状と、同じく STL の移植(っぽい)ライブラリである NGL の今後の話。

 

CL-STL は、ひとまずやれる(と思っている)ことは全部やって、現在テストとドキュメントを書くところまで来ている。来てはいるのだけれど、そこから先はイマイチ捗々しくない。疲れてしまったのもあるし、ドコまで書くべきかで悩む部分もある。あと、正直に書くとテストやドキュメントはあまり好きではないからだ。

で、NGL だ。NGL というのは Microsoft の .NET Framework 向けに STL を移植したものだが、そもそも作った本人がさっぱり使っていないし、公開はしているものの使っている人は多分皆無。それでも、いくつかの理由から修正したいと思う要件が増えてきている。

修正したい最初の理由は、CL-STL の経験を NGL に注ぎ込みたいというものだ。NGL は C++11 の新機能はほとんど入っていないし、CL-STL でいうところの simple-vector 向けの最適化も施されていない。こういった諸々をきちんとこなした上で、(可能な範囲で)STL に沿った作りにしてやりたい。

次の理由は、.NET Framework 4 以降の新機能に関連するものだ。NGL の作成当初は .NET Framework 3.5 をターゲットにしていたが、4 からラムダ式の自由度が向上した。たとえば、複数行にわたるラムダ式を書けるとか。現状の NGL を使って以下のような書き方ができる。

Sub Main()

    Dim cont As New NGL.Vector(Of Integer)(10, 0)
    NGL.Iota(cont.Begin(), cont.End(), 0)

    NGL.ForEach(cont.Begin(), cont.End(), _
                NGL.PtrFun1(Function(v As Integer) As Integer
                                Console.WriteLine(v)
                                Return 0
                            End Function))
End Sub

 

これはいい。しかし、PtrFun1 でくるんで UnaryFunction にする必要ってあるだろうか? ラムダ式をそのまま渡せた方が楽に決まっている‥‥‥というような感覚を、CL-STL を作ってきた中で持つようになったわけだな。

そこで実験。NGL には、UnaryFunctionBinaryFunction に対応するジェネリックなデリゲート型が定義されている。これを、ForEach のようなアルゴリズムがそのまま受け入れてくれれば良い。これをやってみた。MyForEach という名前で、以下の2つのアルゴリズムをオーバーロードする。

Function MyForEach(Of T, R)(ByVal itr1 As NGL.InputIterator(Of T), _
                            ByVal itr2 As NGL.InputIterator(Of T), _
                            ByVal fnc As NGL.UnaryFunction(Of T, R))
    Dim itr = itr1.Clone()
    Dim func = fnc.Clone()
    Do While itr <> itr2
        func.Execute(itr.Value)
        itr.MoveNext()
    Loop
    Return func
End Function

Function MyForEach(Of T, R)(ByVal itr1 As NGL.InputIterator(Of T), _
                            ByVal itr2 As NGL.InputIterator(Of T), _
                            ByVal fnc As NGL.UnaryFunctionDelegate(Of T, R))
    Dim itr = itr1.Clone()
    Do While itr <> itr2
        fnc.Invoke(itr.Value)
        itr.MoveNext()
    Loop
    Return fnc
End Function

 

この状態で、まずは先程と同じことをしてみよう。以下は正常に動作した。

MyForEach(cont.Begin(), cont.End(), _
          NGL.PtrFun1(Function(v As Integer) As Integer
                          Console.WriteLine(v)
                          Return 0
                      End Function))

 

本命は次だ。ラムダ式を直接渡す。これは NGL.UnaryFunctionDelegete(Of Integer, Integer) に自動的に変換されて動作した。成功だ。

MyForEach(cont.Begin(), cont.End(), Function(v As Integer) As Integer
                                        Console.WriteLine(v)
                                        Return 0
                                    End Function)

 

‥‥‥とまぁ、こんなことをやりたいと思っている。あとは ForwardList などの新しいコンテナやいくつかの新しいアルゴリズムの追加など。人様はおろか自分でもさっぱり使っていないライブラリにそれだけの労力を注ぎ込むのかどうか、それはまだわからない。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : STLとその移植

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.