mirror of
https://github.com/qemu/qemu.git
synced 2025-01-07 14:13:27 +08:00
983f52d4b3
We have three classes of QAPI visitors: input, output, and dealloc. Currently, all implementations of these visitors have one thing in common based on their visitor type: the implementation used for the visit_type_enum() callback. But since we plan to add more such common behavior, in relation to documenting and further refining the semantics, it makes more sense to have the visitor implementations advertise which class they belong to, so the common qapi-visit-core code can use that information in multiple places. A later patch will better document the types of visitors directly in visitor.h. For this patch, knowing the class of a visitor implementation lets us make input_type_enum() and output_type_enum() become static functions, by replacing the callback function Visitor.type_enum() with the simpler enum member Visitor.type. Share a common assertion in qapi-visit-core as part of the refactoring. Move comments in opts-visitor.c to match the refactored layout. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1461879932-9020-2-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
74 lines
2.3 KiB
C
74 lines
2.3 KiB
C
/*
|
|
* Core Definitions for QAPI Visitor implementations
|
|
*
|
|
* Copyright (C) 2012-2016 Red Hat, Inc.
|
|
*
|
|
* Author: Paolo Bonizni <pbonzini@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
* See the COPYING.LIB file in the top-level directory.
|
|
*
|
|
*/
|
|
#ifndef QAPI_VISITOR_IMPL_H
|
|
#define QAPI_VISITOR_IMPL_H
|
|
|
|
#include "qapi/visitor.h"
|
|
|
|
/*
|
|
* There are three classes of visitors; setting the class determines
|
|
* how QAPI enums are visited, as well as what additional restrictions
|
|
* can be asserted.
|
|
*/
|
|
typedef enum VisitorType {
|
|
VISITOR_INPUT,
|
|
VISITOR_OUTPUT,
|
|
VISITOR_DEALLOC,
|
|
} VisitorType;
|
|
|
|
struct Visitor
|
|
{
|
|
/* Must be set */
|
|
void (*start_struct)(Visitor *v, const char *name, void **obj,
|
|
size_t size, Error **errp);
|
|
void (*end_struct)(Visitor *v, Error **errp);
|
|
|
|
void (*start_list)(Visitor *v, const char *name, Error **errp);
|
|
/* Must be set */
|
|
GenericList *(*next_list)(Visitor *v, GenericList **list, size_t size);
|
|
/* Must be set */
|
|
void (*end_list)(Visitor *v);
|
|
|
|
/* Optional, needed for input and dealloc visitors. */
|
|
void (*start_alternate)(Visitor *v, const char *name,
|
|
GenericAlternate **obj, size_t size,
|
|
bool promote_int, Error **errp);
|
|
|
|
/* Optional, needed for dealloc visitor. */
|
|
void (*end_alternate)(Visitor *v);
|
|
|
|
/* Must be set. */
|
|
void (*type_int64)(Visitor *v, const char *name, int64_t *obj,
|
|
Error **errp);
|
|
/* Must be set. */
|
|
void (*type_uint64)(Visitor *v, const char *name, uint64_t *obj,
|
|
Error **errp);
|
|
/* Optional; fallback is type_uint64(). */
|
|
void (*type_size)(Visitor *v, const char *name, uint64_t *obj,
|
|
Error **errp);
|
|
/* Must be set. */
|
|
void (*type_bool)(Visitor *v, const char *name, bool *obj, Error **errp);
|
|
void (*type_str)(Visitor *v, const char *name, char **obj, Error **errp);
|
|
void (*type_number)(Visitor *v, const char *name, double *obj,
|
|
Error **errp);
|
|
void (*type_any)(Visitor *v, const char *name, QObject **obj,
|
|
Error **errp);
|
|
|
|
/* May be NULL; most useful for input visitors. */
|
|
void (*optional)(Visitor *v, const char *name, bool *present);
|
|
|
|
/* Must be set */
|
|
VisitorType type;
|
|
};
|
|
|
|
#endif
|