Skip to content

Commit 142c224

Browse files
committed
Add another example on complex structure usage
1 parent 29e8d91 commit 142c224

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

example/ex-array05.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "m-array.h"
2+
#include "m-string.h"
3+
4+
/* This example show how to use complex structure with array
5+
embedding another library */
6+
7+
/* This is a trivial library */
8+
typedef struct lib_ext_struct {
9+
int id;
10+
// Other data
11+
} lib_ext_struct;
12+
13+
static lib_ext_struct *lib_ext_struct_Duplicate(const lib_ext_struct *obj)
14+
{
15+
lib_ext_struct *p = malloc(sizeof(lib_ext_struct));
16+
if (!p) abort();
17+
p->id = obj->id;
18+
return p;
19+
}
20+
21+
static void lib_ext_struct_Delete(lib_ext_struct *obj)
22+
{
23+
free(obj);
24+
}
25+
26+
/* This is the complex structure */
27+
typedef struct {
28+
uint32_t id;
29+
string_t type;
30+
lib_ext_struct* properties;
31+
} data_node;
32+
33+
static void data_node_init(data_node *obj)
34+
{
35+
obj->id = 0;
36+
string_init(obj->type);
37+
obj->properties = NULL;
38+
}
39+
40+
static void data_node_init_set(data_node *obj, const data_node *src)
41+
{
42+
obj->id = src->id;
43+
string_init_set(obj->type, src->type);
44+
if (src->properties)
45+
obj->properties = lib_ext_struct_Duplicate(src->properties);
46+
else
47+
obj->properties = NULL;
48+
}
49+
50+
static void data_node_set(data_node *obj, const data_node *src)
51+
{
52+
obj->id = src->id;
53+
string_set(obj->type, src->type);
54+
if (obj->properties)
55+
lib_ext_struct_Delete(obj->properties);
56+
if (src->properties)
57+
obj->properties = lib_ext_struct_Duplicate(src->properties);
58+
else
59+
obj->properties = NULL;
60+
}
61+
62+
static void data_node_clear(data_node *obj)
63+
{
64+
string_clear(obj->type);
65+
if (obj->properties)
66+
lib_ext_struct_Delete(obj->properties);
67+
}
68+
69+
70+
ARRAY_DEF(array_data_node, data_node, (INIT(API_2(data_node_init)),SET(API_6(data_node_set)),INIT_SET(API_6(data_node_init_set)),CLEAR(API_2(data_node_clear))))
71+
72+
array_data_node_t global_array;
73+
74+
int main(void)
75+
{
76+
array_data_node_init(global_array);
77+
array_data_node_clear(global_array);
78+
}

0 commit comments

Comments
 (0)