xref: /qemu/include/qapi/visitor-impl.h (revision 983f52d4b3f86fb9dc9f8b142132feb5a8723016)
1 /*
2  * Core Definitions for QAPI Visitor implementations
3  *
4  * Copyright (C) 2012-2016 Red Hat, Inc.
5  *
6  * Author: Paolo Bonizni <pbonzini@redhat.com>
7  *
8  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
9  * See the COPYING.LIB file in the top-level directory.
10  *
11  */
12 #ifndef QAPI_VISITOR_IMPL_H
13 #define QAPI_VISITOR_IMPL_H
14 
15 #include "qapi/visitor.h"
16 
17 /*
18  * There are three classes of visitors; setting the class determines
19  * how QAPI enums are visited, as well as what additional restrictions
20  * can be asserted.
21  */
22 typedef enum VisitorType {
23     VISITOR_INPUT,
24     VISITOR_OUTPUT,
25     VISITOR_DEALLOC,
26 } VisitorType;
27 
28 struct Visitor
29 {
30     /* Must be set */
31     void (*start_struct)(Visitor *v, const char *name, void **obj,
32                          size_t size, Error **errp);
33     void (*end_struct)(Visitor *v, Error **errp);
34 
35     void (*start_list)(Visitor *v, const char *name, Error **errp);
36     /* Must be set */
37     GenericList *(*next_list)(Visitor *v, GenericList **list, size_t size);
38     /* Must be set */
39     void (*end_list)(Visitor *v);
40 
41     /* Optional, needed for input and dealloc visitors.  */
42     void (*start_alternate)(Visitor *v, const char *name,
43                             GenericAlternate **obj, size_t size,
44                             bool promote_int, Error **errp);
45 
46     /* Optional, needed for dealloc visitor.  */
47     void (*end_alternate)(Visitor *v);
48 
49     /* Must be set. */
50     void (*type_int64)(Visitor *v, const char *name, int64_t *obj,
51                        Error **errp);
52     /* Must be set. */
53     void (*type_uint64)(Visitor *v, const char *name, uint64_t *obj,
54                         Error **errp);
55     /* Optional; fallback is type_uint64().  */
56     void (*type_size)(Visitor *v, const char *name, uint64_t *obj,
57                       Error **errp);
58     /* Must be set. */
59     void (*type_bool)(Visitor *v, const char *name, bool *obj, Error **errp);
60     void (*type_str)(Visitor *v, const char *name, char **obj, Error **errp);
61     void (*type_number)(Visitor *v, const char *name, double *obj,
62                         Error **errp);
63     void (*type_any)(Visitor *v, const char *name, QObject **obj,
64                      Error **errp);
65 
66     /* May be NULL; most useful for input visitors. */
67     void (*optional)(Visitor *v, const char *name, bool *present);
68 
69     /* Must be set */
70     VisitorType type;
71 };
72 
73 #endif
74