SWIGのシャドークラス

SWIG使ってフラクタル図形を書いた際にshadowってオプションをつけたのだけどよくわかってなかったのでちゃんと調べた(というか実用Perlプログラミングに書いてあったんだけど)。

C/C++のオブジェクトのメンバ属性、メンバ関数に対し、perlのハッシュ記法でアクセスできるようにするメカニズムだそうだ。

class Shape {
public:
    int x, y;
    int w, h;
    drwaw();
};
class Poligon : public Shape {
public:
    polygon(int x, int y, int w, int h);
    draw();
};

とやると

use Graphics;
$poly = new Polygon(10, 10, 30, 40);

print $poly->{x}, $poly->{y};

みたいにアクセスできるようにするオプションだそうだ。

ProductName 実用Perlプログラミング
スリラム スリニバサン
オライリー・ジャパン / ?円 ( 1998-11 )


初めてのSWIG

openbabelのperlラッパーに触発されたので、実用Perlプログラミングの初版を片手に。SWIGを使って、マンデルブロ集合を描いてみた。

mandelbrot

思ってたよりも、楽だ。まず、本の18章の mandel.cmandel.hを用意する。本だとgifに出力してあったが、FC1のgd-2.0.15.1ではできなかったのでpngで出力するようになってる。

続いて、SWIGインターフェースのFractal.i

%module Fractal
%{
#include "mandel.h"
%}
%include mandel.h

を用意したら、swigコマンドを実行。本だとperl5を引数にとってたけど、ネット調べたらperlでいけそうだし、-shadowオプション付けてるのが多いので、よくわからんけど付けてみた(これは後でちゃんと調べる)。

$ swig -shadow -perl Fractal.i

あとはMakeFile.PL書いて、普通にmakeでOK

use ExtUtils::MakeMaker;
WriteMakefile(
              'NAME' => 'Fractal',
              'LIBS' => ['-L/home/kzfm/perltest/swigtest -lgd'],
              'INC'  => '-I/home/kzfm/perltest/swigtest',
              'OBJECT' => 'mandel.o Fractal_wrap.o'
              );

Perlで呼び出す

普通にモジュールを呼び出すだけですな。

use Fractal;
Fractal::draw_mandel('mandel.png', 300, 300,
                     -1.5, 1.0,
                     2.0, 20);

で、絵の出来上がり!

実用Perlプログラミングは初版、第二版ともにもっているけど、型グロブとかクロージャとかXS,SWIGなんかは初版の方が詳しく書いてあるので、僕は今でも重宝するヨ。というか最近わかってきたっぽくて読むのが楽しい。

ProductName 実用Perlプログラミング
スリラム スリニバサン
オライリー・ジャパン / ?円 ( 1998-11 )