aboutsummaryrefslogtreecommitdiffstats
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.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h
new file mode 100644
index 000000000..adf9a788e
--- /dev/null
+++ b/include/qapi/clone-visitor.h
@@ -0,0 +1,51 @@
+/*
+ * 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, bool (*visit_type)(Visitor *, const char *,
+ void **, Error **));
+void qapi_clone_members(void *dst, const void *src, size_t sz,
+ bool (*visit_type_members)(Visitor *, 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, \
+ (bool (*)(Visitor *, const char *, void **, \
+ Error **))visit_type_ ## type))
+
+/*
+ * Copy deep clones of @type members from @src to @dst.
+ *
+ * Not usable on QAPI scalars (integers, strings, enums), nor on a
+ * QAPI object that references the 'any' type.
+ */
+#define QAPI_CLONE_MEMBERS(type, dst, src) \
+ qapi_clone_members(dst, src, sizeof(type), \
+ (bool (*)(Visitor *, void *, \
+ Error **))visit_type_ ## type ## _members)
+
+#endif