qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

clone-visitor.h (1890B)


      1 /*
      2  * Clone Visitor
      3  *
      4  * Copyright (C) 2016 Red Hat, Inc.
      5  *
      6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
      7  * See the COPYING file in the top-level directory.
      8  *
      9  */
     10 
     11 #ifndef QAPI_CLONE_VISITOR_H
     12 #define QAPI_CLONE_VISITOR_H
     13 
     14 #include "qapi/visitor.h"
     15 
     16 /*
     17  * The clone visitor is for direct use only by the QAPI_CLONE() macro;
     18  * it requires that the root visit occur on an object, list, or
     19  * alternate, and is not usable directly on built-in QAPI types.
     20  */
     21 typedef struct QapiCloneVisitor QapiCloneVisitor;
     22 
     23 void *qapi_clone(const void *src, bool (*visit_type)(Visitor *, const char *,
     24                                                      void **, Error **));
     25 void qapi_clone_members(void *dst, const void *src, size_t sz,
     26                         bool (*visit_type_members)(Visitor *, void *,
     27                                                    Error **));
     28 
     29 /*
     30  * Deep-clone QAPI object @src of the given @type, and return the result.
     31  *
     32  * Not usable on QAPI scalars (integers, strings, enums), nor on a
     33  * QAPI object that references the 'any' type.  Safe when @src is NULL.
     34  */
     35 #define QAPI_CLONE(type, src)                                           \
     36     ((type *)qapi_clone(src,                                            \
     37                         (bool (*)(Visitor *, const char *, void **,     \
     38                                   Error **))visit_type_ ## type))
     39 
     40 /*
     41  * Copy deep clones of @type members from @src to @dst.
     42  *
     43  * Not usable on QAPI scalars (integers, strings, enums), nor on a
     44  * QAPI object that references the 'any' type.
     45  */
     46 #define QAPI_CLONE_MEMBERS(type, dst, src)                              \
     47     qapi_clone_members(dst, src, sizeof(type),                          \
     48                        (bool (*)(Visitor *, void *,                     \
     49                                  Error **))visit_type_ ## type ## _members)
     50 
     51 #endif