3種類のコンテナがあります。
- リスト
- マップ
- オブジェクト
値は順序立てて格納されます。
[2, 5, 9.1, "value", true]
binn *list;
// 新しいリストを作成
list = binn_list();
// 値を追加
binn_list_add_int32(list, 123);
binn_list_add_double(list, 2.55);
binn_list_add_str(list, "testing");
// ネットワーク経由で送信するか、ファイルに保存する...
send(sock, binn_ptr(list), binn_size(list));
// バッファを解放
binn_free(list);
int id;
double rate;
char *name;
id = binn_list_int32(list, 1);
rate = binn_list_double(list, 2);
name = binn_list_str(list, 3);
int i, count;
double note;
count = binn_count(list);
for(i=1; i<=count; i++) {
note = binn_list_double(list, i);
}
binn_iter iter;
binn value;
binn_list_foreach(list, value) {
do_something(&value);
}
値は整数キーで格納されます。
{2: "test", 5: 2.5, 10: true}
マップを使用するアプリケーション間で共有されるヘッダーファイルで整数キーを定義できます。
#define USER_ID 11
#define USER_NAME 12
#define USER_VALUE 13
binn *map;
// 新しいマップを作成
map = binn_map();
// 値を追加
binn_map_set_int32(map, USER_ID, 123);
binn_map_set_str(map, USER_NAME, "John");
binn_map_set_double(map, USER_VALUE, 2.55);
// ネットワーク経由で送信するか、ファイルに保存する...
send(sock, binn_ptr(map), binn_size(map));
// バッファを解放
binn_free(map);
int id;
char *name;
double note;
id = binn_map_int32(map, USER_ID);
name = binn_map_str(map, USER_NAME);
note = binn_map_double(map, USER_VALUE);
binn_iter iter;
binn value;
int id;
binn_map_foreach(map, id, value) {
do_something(id, &value);
}
値は文字列キーで格納されます。
{"name": "John", "grade": 8.5, "active": true}
binn *obj;
// 新しいオブジェクトを作成
obj = binn_object();
// 値を追加
binn_object_set_int32(obj, "id", 123);
binn_object_set_str(obj, "name", "John");
binn_object_set_double(obj, "total", 2.55);
// ネットワーク経由で送信するか、ファイルに保存する...
send(sock, binn_ptr(obj), binn_size(obj));
// バッファを解放
binn_free(obj);
int id;
char *name;
double total;
id = binn_object_int32(obj, "id");
name = binn_object_str(obj, "name");
total = binn_object_double(obj, "total");
binn_iter iter;
binn value;
char key[256];
binn_object_foreach(obj, key, value) {
do_something(key, &value);
}
他のコンテナの中にコンテナを入れることができます(オブジェクトの中のリスト、オブジェクトのリスト、マップのリスト...)
{id: 123, name: "John", values: [2.5, 7.35, 9.15]}
binn *obj, *list;
// 新しいオブジェクトを作成
obj = binn_object();
// 値を追加
binn_object_set_int32(obj, "id", 123);
binn_object_set_str(obj, "name", "John");
// 新しいリストを作成
list = binn_list();
binn_list_add_double(list, 2.50);
binn_list_add_double(list, 7.35);
binn_list_add_double(list, 9.15);
binn_object_set_list(obj, "values", list);
binn_free(list);
// ネットワーク経由で送信するか、ファイルに保存する...
send(sock, binn_ptr(obj), binn_size(obj));
// メモリを解放
binn_free(obj);
int id, i, count;
char *name;
void *list;
double grade;
id = binn_object_int32(obj, "id");
name = binn_object_str(obj, "name");
list = binn_object_list(obj, "values");
count = binn_count(list);
for(i=1; i<=count; i++) {
grade = binn_list_double(list, i);
}
[ {name: "John", email: "[email protected]"} , {name: "Eric", email: "[email protected]"} ]
binn *list, *obj;
// 新しいリストを作成
list = binn_list();
// 最初のオブジェクトを作成
obj = binn_object();
binn_object_set_str(obj, "name", "John");
binn_object_set_str(obj, "email", "[email protected]");
// リストに追加して破棄
binn_list_add_object(list, obj);
binn_free(obj);
// 2番目のオブジェクトを作成
obj = binn_object();
binn_object_set_str(obj, "name", "Eric");
binn_object_set_str(obj, "email", "[email protected]");
// リストに追加して破棄
binn_list_add_object(list, obj);
binn_free(obj);
// ネットワーク経由で送信するか、ファイルに保存する...
send(sock, binn_ptr(list), binn_size(list));
// メモリを解放
binn_free(list);
int i, count;
void *obj;
char *name, *email;
count = binn_count(list);
for(i=1; i<=count; i++) {
obj = binn_list_object(list, i);
name = binn_object_str(obj, "name");
email = binn_object_str(obj, "email");
}
読み取り時に、内部コンテナは「解放」されない静的ポインタとして返されます。
いくつかの関数は、binn値と呼ばれる構造を返します。以下は、それらを扱う例です。
void print_value(binn *value) {
switch (value->type) {
case BINN_INT32:
printf("integer: %d\n", value->vint32);
break;
case BINN_STRING:
printf("string: %s\n", value->ptr);
break;
...
}
}