]>
Commit | Line | Data |
---|---|---|
a15fcc3c EB |
1 | /* |
2 | * Clone Visitor | |
3 | * | |
4 | * Copyright (C) 2016 Red Hat, Inc. | |
5 | * | |
6 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
7 | * See the COPYING file in the top-level directory. | |
8 | * | |
9 | */ | |
10 | ||
11 | #ifndef QAPI_CLONE_VISITOR_H | |
12 | #define QAPI_CLONE_VISITOR_H | |
13 | ||
14 | #include "qapi/visitor.h" | |
15 | ||
16 | /* | |
17 | * The clone visitor is for direct use only by the QAPI_CLONE() macro; | |
18 | * it requires that the root visit occur on an object, list, or | |
19 | * alternate, and is not usable directly on built-in QAPI types. | |
20 | */ | |
21 | typedef struct QapiCloneVisitor QapiCloneVisitor; | |
22 | ||
23 | void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *, | |
24 | void **, Error **)); | |
4626a19c MA |
25 | void qapi_clone_members(void *dst, const void *src, size_t sz, |
26 | void (*visit_type_members)(Visitor *, void *, | |
27 | Error **)); | |
a15fcc3c EB |
28 | |
29 | /* | |
30 | * Deep-clone QAPI object @src of the given @type, and return the result. | |
31 | * | |
32 | * Not usable on QAPI scalars (integers, strings, enums), nor on a | |
33 | * QAPI object that references the 'any' type. Safe when @src is NULL. | |
34 | */ | |
35 | #define QAPI_CLONE(type, src) \ | |
36 | ((type *)qapi_clone(src, \ | |
37 | (void (*)(Visitor *, const char *, void**, \ | |
38 | Error **))visit_type_ ## type)) | |
39 | ||
4626a19c MA |
40 | /* |
41 | * Copy deep clones of @type members from @src to @dst. | |
42 | * | |
43 | * Not usable on QAPI scalars (integers, strings, enums), nor on a | |
44 | * QAPI object that references the 'any' type. | |
45 | */ | |
46 | #define QAPI_CLONE_MEMBERS(type, dst, src) \ | |
47 | qapi_clone_members(dst, src, sizeof(type), \ | |
48 | (void (*)(Visitor *, void *, \ | |
49 | Error **))visit_type_ ## type ## _members) | |
50 | ||
a15fcc3c | 51 | #endif |