Lux IOのPerlバインディングを作成した
id:mogwaingさんが開発されているYet AnotherなDBMであるところのLux IOを使ってみたくなったので、Perlから使えるようバインディングを書いてみました。初XSな上にC/C++もろくに書いたことがないのでわかんないところだらけですが、なんか一応動くようになったっぽいので、GitHubに上げておきました。
ご覧になればわかる通り、なんかせっかくC++ライブラリを触るのに、関数をベタベタ書いてラップしてるだけで、なんともダサい感じ。typemapをうまく使えばいい感じになるということだったのだけど、Lux::IO::Btreeみたいなコロンつきの型や、Lux::IO::*以下にあるstructやenumをどうtypemapすればいいのかわからなかったので、こんな感じに。
以下、あれこれ試行錯誤する中で疑問だったり、やり残したりしたこと。
- コロンつきの型を普通にtypemapしようとするとエラーになる?
- たとえばtypedef Lux::IO::Btree Lux_IO_Btree;とかいちいちtypedefしてまわればできないことはないけど、ダサい感じ。
- typedefするんじゃなくてusing namespace Lux::IO;とかすればいけるかも……?
- フラグの扱いがまだちゃんとできてない。Perl側でどう定義してやるのがいいんかなー。
次は、typemapしてスマートな感じにしたいところです。
あと、以下に一応使い方を示しておきます。つっても、特に何もないけど。
use Lux::IO; use Lux::IO::Btree; my $bt = Lux::IO::Btree->new; $bt->open('test', Lux::IO::DB_CREAT); $bt->put('key', 'value'); #=> true $bt->get('key'); #=> 'value' $bt->del('key'); #=> true $bt->get('key'); #-> false $bt->close;