手作業ですることメモ:



int* の対応
int* x 等となっている部分を全て変更する。数値の取得の場合は int*wxCoord* の2種類存在する。wxCoord は int の alias である。具体的な例を示すと、

  /* wxBitmap.d line 158 */
  public void GetDeviceOrigin(int* _x, int* _y) {
    wxDC_GetDeviceOrigin(_instance, _x, _y);
  }

  public void GetDeviceOrigin(out int _x, out int _y) {
    wxDC_GetDeviceOrigin(_instance, &_x, &_y);
  }

のように変更する。自動で変換したいところだが、inout にしなければならないところや、int の配列を渡す場合があるために不可能。inout にしなければならない例を示すと、

  /* wxWindow.d line 506 */
  public void ScreenToClient(int* x, int* y) {
    wxWindow_ScreenToClient(_instance, x, y);
  }

public void ScreenToClient(inout int x, inout int y) {
    wxWindow_ScreenToClient(_instance, &x, &y);
  }

のように変更する。ぱっと見気づかないかもしれないので注意。wxc のラップ関数のソースを見ても確認できないので、wxWidgets のソースかマニュアルを確認すること。マニュアルには

Stores the screen x coordinate and receives the client x coordinate.

と書いてある。ソースには、ほぼ確実に if (x) 変数 = *x というコードがあり、それをやっていれば inout にする必要がある。

int の配列を渡す場合の例は、

  /* wxDC.d line 115 */
  public void DrawLines(int n, int* x, int* y, int xoffset, int yoffset) {
    wxDC_DrawLines(_instance, x.length, x, y, xoffset, yoffset);
  }

を、デフォルト引数とあわせて

  public void DrawLines(int x, int y, int xoffset = 0, int yoffset = 0) {
    assert(x.length == y.length);
    wxDC_DrawLines(_instance, x.length, cast(void*)x, cast(void*)y, xoffset, yoffset);
  }

と変更する。(配列の長さチェックの部分は assert にするか例外にするか迷っているので、意見募集)cast(void*) は必要ないので、面倒な場合は付加しなくて良い。

void* となっているところでも、int* の可能性があるので注意すること。






デフォルト引数への対応
wxWidgets のマニュアルから*1、デフォルト引数の情報を引張ってくる。

特に迷うところは無いだろうが、一つだけ厄介なところがあって、int* を out int に変更したせいで、 int* x = null というコードの場合、out int x = null とは書けなくなってしまったということである。その場合は、

  /* マニュアルにこうあった場合 */
  Example::GetPosition(int id, int* x = null, int* y = null, wxWindow parent = null)

  public void GetPosition(int id) {
    Example_GetPosition(_instance, id, null, null, null);
  }
  public void GetPosition(int id, out int x) {
    Example_GetPosition(_instance, id, &x, null, null);
  }
  public void GetPosition(int id, out int x, out int y, wxWindow parent = null) {
    Example_GetPosition(_instance, id, &x, &y, parent);
  }

と関数を分けて書く。wxWindow parent = null は通るのでそのまま。

ほかに、wxc では必要ないであろうデフォルト引数は、最初から省いている場合もある。(例えば wxWindow::Show は Show(bool flag = true) であるが、wxc では Show(void) である)そういう場合はそのままで良い。






同じ関数名で引数が違うだけで複数ある場合
wxWidgets にはそういう関数が非常に多い。wxc ではそういうものは名前を多少変えてラッピングしてある。Create1, Create2, GetByName, GetById など。そういう場合は、出来る限りオリジナルの名前一つに統一すること。

GetByName(char name) → Get(char name)
GetById(int id) → Get(int id)




static な関数
マニュアルで static と表記してある関数は public static void Function() と変更する。






マニュアルは信用しない
マニュアルはたまに間違っている(戻り値が無いはずなのに bool と書いてあったり)ので、気づいたらソースを確認すること。






void* は疑う
void* は、クラスを渡す部分かもしれないし、値を受け取るために int* になるところかもしれない。void* となっているのは wxc の ewxw_glue.h から自動化用のリストを生成したためで、3000関数以上あるそのリストは完全には void* を書き換えきれていないためである。






マニュアルにはあって wxD(wxc) には無い関数
例えば、wxDC::DrawSpline は wxc に無くて、有用(そう)でありそうなので、wxc のソースに追加した。ただし、あまり使わないであろう関数は入れる必要は無い。





これだけの作業を300ファイルやれば完成だ、ヨヾ( ゜∀゜)ノ゛
ちなみに、この作業を行ったのはまだ3ファイル on_ というわけで、手伝って欲しいのはこの作業であります。

*1:Google でクラス名をWeb全体から検索すればほぼそのクラスのマニュアルがヒットする