aboutsummaryrefslogtreecommitdiff
path: root/include/qapi/clone-visitor.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/qapi/clone-visitor.h')
-rw-r--r--include/qapi/clone-visitor.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h
new file mode 100644
index 0000000000..16ceff55dd
--- /dev/null
+++ b/include/qapi/clone-visitor.h
@@ -0,0 +1,37 @@
+/*
+ * Clone Visitor
+ *
+ * Copyright (C) 2016 Red Hat, Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QAPI_CLONE_VISITOR_H
+#define QAPI_CLONE_VISITOR_H
+
+#include "qapi/visitor.h"
+
+/*
+ * The clone visitor is for direct use only by the QAPI_CLONE() macro;
+ * it requires that the root visit occur on an object, list, or
+ * alternate, and is not usable directly on built-in QAPI types.
+ */
+typedef struct QapiCloneVisitor QapiCloneVisitor;
+
+void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
+ void **, Error **));
+
+/*
+ * Deep-clone QAPI object @src of the given @type, and return the result.
+ *
+ * Not usable on QAPI scalars (integers, strings, enums), nor on a
+ * QAPI object that references the 'any' type. Safe when @src is NULL.
+ */
+#define QAPI_CLONE(type, src) \
+ ((type *)qapi_clone(src, \
+ (void (*)(Visitor *, const char *, void**, \
+ Error **))visit_type_ ## type))
+
+#endif