■
手作業ですることメモ:
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_ というわけで、手伝って欲しいのはこの作業であります。