1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#define BENCH_TITLE "flatcc for C"
#define BENCHMARK_BUFSIZ 1000
#define DECLARE_BENCHMARK(BM)\
flatcc_builder_t builder, *BM;\
BM = &builder;\
flatcc_builder_init(BM);
#define CLEAR_BENCHMARK(BM) flatcc_builder_clear(BM);
#include "flatbench_builder.h"
#define C(x) FLATBUFFERS_WRAP_NAMESPACE(benchfb_FooBarContainer, x)
#define FooBar(x) FLATBUFFERS_WRAP_NAMESPACE(benchfb_FooBar, x)
#define Bar(x) FLATBUFFERS_WRAP_NAMESPACE(benchfb_Bar, x)
#define Foo(x) FLATBUFFERS_WRAP_NAMESPACE(benchfb_Foo, x)
#define Enum(x) FLATBUFFERS_WRAP_NAMESPACE(benchfb_Enum, x)
#define True flatbuffers_true
#define False flatbuffers_false
#define StringLen flatbuffers_string_len
int encode(flatcc_builder_t *B, void *buffer, size_t *size)
{
int i, veclen = 3;
void *buffer_ok;
flatcc_builder_reset(B);
C(start_as_root(B));
C(list_start(B));
for (i = 0; i < veclen; ++i) {
/*
* By using push_start instead of push_create we can construct
* the sibling field (of Bar type) in-place on the stack,
* otherwise we would need to create a temporary Bar struct.
*/
C(list_push_start(B));
FooBar(sibling_create(B,
0xABADCAFEABADCAFE + i, 10000 + i, '@' + i, 1000000 + i,
123456 + i, 3.14159f + i, 10000 + i));
FooBar(name_create_str(B, "Hello, World!"));
FooBar(rating_add(B, 3.1415432432445543543 + i));
FooBar(postfix_add(B, '!' + i));
C(list_push_end(B));
}
C(list_end(B));
C(location_create_str(B, "https://www.example.com/myurl/"));
C(fruit_add(B, Enum(Bananas)));
C(initialized_add(B, True));
C(end_as_root(B));
/*
* This only works with the default emitter and only if the buffer
* is larger enough. Otherwise use whatever custom operation the
* emitter provides.
*/
buffer_ok = flatcc_builder_copy_buffer(B, buffer, *size);
*size = flatcc_builder_get_buffer_size(B);
return !buffer_ok;
}
int64_t decode(flatcc_builder_t *B, void *buffer, size_t size, int64_t sum)
{
unsigned int i;
C(table_t) foobarcontainer;
FooBar(vec_t) list;
FooBar(table_t) foobar;
Bar(struct_t) bar;
Foo(struct_t) foo;
(void)B;
foobarcontainer = C(as_root(buffer));
sum += C(initialized(foobarcontainer));
sum += StringLen(C(location(foobarcontainer)));
sum += C(fruit(foobarcontainer));
list = C(list(foobarcontainer));
for (i = 0; i < FooBar(vec_len(list)); ++i) {
foobar = FooBar(vec_at(list, i));
sum += StringLen(FooBar(name(foobar)));
sum += FooBar(postfix(foobar));
sum += (int64_t)FooBar(rating(foobar));
bar = FooBar(sibling(foobar));
sum += (int64_t)Bar(ratio(bar));
sum += Bar(size(bar));
sum += Bar(time(bar));
foo = Bar(parent(bar));
sum += Foo(count(foo));
sum += Foo(id(foo));
sum += Foo(length(foo));
sum += Foo(prefix(foo));
}
return sum + 2 * sum;
}
/* Copy to same folder before compilation or use include directive. */
#include "benchmain.h"
|