ページ

2012年3月4日日曜日

Swig対処メモ

Swig 2.0.4を対象としています。
  • privateコンストラクタだから生成できない
    %templateでそのクラスのwrapperを作成している。(wrapper作るとinstantつくるので)
    対策: wrapperを作らない。必要なら、コンストラクタをpublicに置いたclassをswig用interfaceファイル内で再定義。
  • allocate がかぶる
    wrapper作成対象クラスにallocate関数があると、swigが内部生成するallocate関数とかぶる模様。
    対策: クラスのallocate関数を%rename。
  • typedefで定義された別名クラス名でインスタンスは作れない
    そもそも、その別名クラス名のwrapperが作成されない。(元の型と別名型の共通性はswig内で管理されている)
    対策: 元の名前のクラスを使う。
  • template内typedefを利用した何か
    概ねswigでうまく扱えない。もしかしたらできるのかもしれないが、%templateの展開地獄と型不一致地獄に延々巻き込まれるので、精神衛生上swigのversion upを待った方が良い。(2.0.5でtypedef絡みのpatchがありそうなので)。
    対策: そのクラスのwrappingを諦める。伝家の宝刀 %extendを使い、その諦めたクラスを使っているクラスに諦めたクラスに対する代替I/Fを追加する。
    • 例1: map::mapped_typeを使ってごちゃごちゃするOgre::MapIterator
      対策: Managerクラス内のデータ参照に使っているので、Managerクラスにeach_datatypeを作る。
    • 例2: Ogre::vector::typeを使うStringVector
      対策: StringVector自体は、RubyのArrayと等価。なので、StringVectorの代わりにArrayを受け取る/返す操作をするI/Fを追加する。もしくはArrayの代わりに別途StringVectorを内部で使用している新しいクラスを自作、それ向けのI/Fを同様に追加。
  • Listener/Handler対策
    C++側にListenerクラスを継承したRubyクラスを登録し、C++側からRuby側のクラスを呼び出すタイプの話。SwigのドキュメントのCross language polymorphismに対策が書いてある。
    対策
    1. トップの%moduleにdirectors="1"
      %module(directors="1") "MyNameSpace"
    2. Ruby側で継承するListenerクラスwrapperにdirector
      %feature("director") Ogre::FrameListener;

0 件のコメント:

コメントを投稿