aboutsummaryrefslogtreecommitdiff
path: root/include/qapi/visitor-impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/qapi/visitor-impl.h')
-rw-r--r--include/qapi/visitor-impl.h26
1 files changed, 18 insertions, 8 deletions
diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
index 145afd0..8bd47ee 100644
--- a/include/qapi/visitor-impl.h
+++ b/include/qapi/visitor-impl.h
@@ -27,14 +27,18 @@
*/
/*
- * There are three classes of visitors; setting the class determines
+ * There are four classes of visitors; setting the class determines
* how QAPI enums are visited, as well as what additional restrictions
- * can be asserted.
+ * can be asserted. The values are intentionally chosen so as to
+ * permit some assertions based on whether a given bit is set (that
+ * is, some assertions apply to input and clone visitors, some
+ * assertions apply to output and clone visitors).
*/
typedef enum VisitorType {
- VISITOR_INPUT,
- VISITOR_OUTPUT,
- VISITOR_DEALLOC,
+ VISITOR_INPUT = 1,
+ VISITOR_OUTPUT = 2,
+ VISITOR_CLONE = 3,
+ VISITOR_DEALLOC = 4,
} VisitorType;
struct Visitor
@@ -47,7 +51,7 @@ struct Visitor
void (*check_struct)(Visitor *v, Error **errp);
/* Must be set to visit structs */
- void (*end_struct)(Visitor *v);
+ void (*end_struct)(Visitor *v, void **obj);
/* Must be set; implementations may require @list to be non-null,
* but must document it. */
@@ -58,7 +62,7 @@ struct Visitor
GenericList *(*next_list)(Visitor *v, GenericList *tail, size_t size);
/* Must be set */
- void (*end_list)(Visitor *v);
+ void (*end_list)(Visitor *v, void **list);
/* Must be set by input and dealloc visitors to visit alternates;
* optional for output visitors. */
@@ -67,7 +71,7 @@ struct Visitor
bool promote_int, Error **errp);
/* Optional, needed for dealloc visitor */
- void (*end_alternate)(Visitor *v);
+ void (*end_alternate)(Visitor *v, void **obj);
/* Must be set */
void (*type_int64)(Visitor *v, const char *name, int64_t *obj,
@@ -104,6 +108,12 @@ struct Visitor
/* Must be set */
VisitorType type;
+
+ /* Must be set for output visitors, optional otherwise. */
+ void (*complete)(Visitor *v, void *opaque);
+
+ /* Must be set */
+ void (*free)(Visitor *v);
};
#endif