|
From: Masaaki A. <mas...@gm...> - 2011-12-03 07:27:56
|
青柳です。
> はい、基本的にはそれでよいと思います。
ありがとうございます!
>> struct gobjgslist2rval_args {
>> GSList *list;
>> GFreeFunc free_list;
>> GFreeFunc free_elem;
>> };
>
> GSListを解放する方法はg_slist_free()しかないと思うので、
> GFreeFuncなfree_listではなく、gbooleanで十分じゃないかと思い
> ました。
>
> もしかしたら、要素を解放するときはリスト自体も削除する、とい
> う風にしてしまって、free_list自体をなくしてしまってもいいか
> もしれません。要素だけを解放したい時ってあるのかしら。リスト
> の中に解放済み要素だけあっても意味無いですよねぇ。
確かに、あまりfree_listの存在意義はないかもしれません。ただ、
* リファレンスを見て、使えという関数をコピペすればいいので単純
* もしかしたら、解放されるタイミングで何か処理を入れたくなるかもしれない
という感じで今の仕様としました。
>> static VALUE
>> gobjgslist2rval_body(VALUE data)
>> {
>> struct gobjgslist2rval_args *args = (struct gobjgslist2rval_args *)data;
>> GSList *i;
>> VALUE ary;
>>
>> ary = rb_ary_new();
>> for (i = args->list; i != NULL; i = i->next)
>> rb_ary_push(ary, GOBJ2RVAL(i->data));
>>
>> return ary;
>> }
>
> 実は、個人的には
>
> GSList *node;
> ...
> for (node = args->list; node; node = g_slist_next(node))
> ...
>
> という書き方が好みだったりします。
> (より適切な名前を使っていると思うので。)
>
> もしよければ採用してもらえると嬉しいです。
現状に合わせただけなので、g_slist_nextを使用するようにします。
>> のようなものを定義し、マクロとしては
>>
>> #define GOBJGSLIST2RVAL(list) \
>> rbgutil_gobjgslist2rval(list, (GFreeFunc)NULL, (GFreeFunc)NULL)
>> #define GOBJGSLIST2RVAL_FREE(list, free_list, free_elem) \
>> rbgutil_gobjgslist2rval(list, (GFreeFunc)free_list,
>> (GFreeFunc)free_elem)
>
> GSListにはGObject以外にもgchar *とかも入っていそうなので、解
> 放する関数をGFreeFuncでカスタマイズできるようにするなら、最
> 初の「GOBJ」は抜いたほうがいいかなぁと思いました。
すみません。言葉足らずでしたが、GOBJ2RVALを型によって変更する必要があるので、
要素の型の数だけ同様のものを用意します。
(たぶんensureは共通にできるとは思っています)
|