たぶんモチベーションがそこそこある今のうちに書かないと、次に書く気になるのがいつになるかわからないので、殴り書きしておく。オリジナルのサンプルは
ココ。
構造体の直列化関数 (ディスクリプタ) を定義するには関数 eet_data_descriptor_new() を使う。関数 evas_* とか使っているのが個人的には気持ち悪く感じる。(つまり、このサンプルは evas がないと動かない。必要な関数ならば eet で提供しろと言いたい。)
ディスクリプタへのメンバの追加はマクロ EET_DATA_DESCRIPTOR_ADD_*() で行う。メンバがプリミティブの場合は BASIC で追加する。引数には型に合った EET_T_* を指定する。
typedef struct _Int128 {
int64_t hi;
int64_t lo;
} Int128;
int main(int argc, char** argv)
{
:
:
Eet_Data_Descriptor *edd_Int128 = eet_data_descriptor_new("Int128", sizeof(Int128),
evas_list_next,
evas_list_append,
evas_list_data,
evas_list_free,
evas_hash_foreach,
evas_hash_add,
evas_hash_free);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Int128, Int128, "hi", hi, EET_T_LONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Int128, Int128, "lo", lo, EET_T_LONG_LONG);
:
:
}
別の構造体へのポインタの場合はあらかじめその構造体のディスクリプタを作っておいて、SUB でそれを追加する。
typedef struct _Hoge {
int8_t i8;
int16_t i16;
int32_t i32;
int64_t i64;
float f32;
double f64;
char *str;
Int128 *p128;
} Hoge;
int main(int argc, char** argv)
{
:
:
Eet_Data_Descriptor *edd_Hoge = eet_data_descriptor_new("Hoge", sizeof(Hoge),
evas_list_next,
evas_list_append,
evas_list_data,
evas_list_free,
evas_hash_foreach,
evas_hash_add,
evas_hash_free);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "i8", i8, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "i16", i16, EET_T_SHORT);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "i32", i32, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "i64", i64, EET_T_LONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "f32", f32, EET_T_FLOAT);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "f64", f64, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(edd_Hoge, Hoge, "str", str, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_SUB(edd_Hoge, Hoge, "p128", p128, edd_Int128);
:
:
}
リストを直列化できる LIST とかもあるんだけど、説明がめんどいので、あとは以下のソースのコメントを参考にしてください。
とりあえずコンパイルしたら動くはずのサンプルと実行結果