qapi: New QAPI_CLONE_MEMBERS()
QAPI_CLONE() returns a newly allocated QAPI object. Inconvenient when we want to clone into an existing object. QAPI_CLONE_MEMBERS() does exactly that. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <1493192202-3184-4-git-send-email-armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
		
							parent
							
								
									0785bd7a7c
								
							
						
					
					
						commit
						4626a19c86
					
				@ -24,6 +24,9 @@ typedef struct QapiCloneVisitor QapiCloneVisitor;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
 | 
					void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
 | 
				
			||||||
                                                     void **, Error **));
 | 
					                                                     void **, Error **));
 | 
				
			||||||
 | 
					void qapi_clone_members(void *dst, const void *src, size_t sz,
 | 
				
			||||||
 | 
					                        void (*visit_type_members)(Visitor *, void *,
 | 
				
			||||||
 | 
					                                                   Error **));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Deep-clone QAPI object @src of the given @type, and return the result.
 | 
					 * Deep-clone QAPI object @src of the given @type, and return the result.
 | 
				
			||||||
@ -36,4 +39,15 @@ void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
 | 
				
			|||||||
                        (void (*)(Visitor *, const char *, void**,      \
 | 
					                        (void (*)(Visitor *, const char *, void**,      \
 | 
				
			||||||
                                  Error **))visit_type_ ## type))
 | 
					                                  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),                          \
 | 
				
			||||||
 | 
					                       (void (*)(Visitor *, void *,                     \
 | 
				
			||||||
 | 
					                                 Error **))visit_type_ ## type ## _members)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -180,3 +180,16 @@ void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
 | 
				
			|||||||
    visit_free(v);
 | 
					    visit_free(v);
 | 
				
			||||||
    return dst;
 | 
					    return dst;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qapi_clone_members(void *dst, const void *src, size_t sz,
 | 
				
			||||||
 | 
					                        void (*visit_type_members)(Visitor *, void *,
 | 
				
			||||||
 | 
					                                                   Error **))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Visitor *v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    v = qapi_clone_visitor_new();
 | 
				
			||||||
 | 
					    memcpy(dst, src, sz);
 | 
				
			||||||
 | 
					    to_qcv(v)->depth++;
 | 
				
			||||||
 | 
					    visit_type_members(v, dst, &error_abort);
 | 
				
			||||||
 | 
					    visit_free(v);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user