diff mbox

[v2,2/9] qom: macroify integer property helpers

Message ID 1404324093-19225-3-git-send-email-agraf@suse.de
State New
Headers show

Commit Message

Alexander Graf July 2, 2014, 6:01 p.m. UTC
We have a bunch of nice helpers that allow us to easily register an integer
field as QOM property. However, we have those duplicated for every integer
size available.

This is very cumbersome (and prone to bugs) to work with and extend, so let's
strip out the only difference there is (the size) and generate the actual
functions via a macro.

Signed-off-by: Alexander Graf <agraf@suse.de>

---

v1 -> v2:

  - Rename DECLARE_INTEGER_VISITOR to DECLARE_PROP_SET_GET
  - Make macro take name and type arguments, enabling generation of "bool"
    types later
---
 qom/property.c | 82 +++++++++++++++++-----------------------------------------
 1 file changed, 24 insertions(+), 58 deletions(-)

Comments

Peter Crosthwaite July 31, 2014, 1:44 p.m. UTC | #1
On Thu, Jul 3, 2014 at 4:01 AM, Alexander Graf <agraf@suse.de> wrote:
> We have a bunch of nice helpers that allow us to easily register an integer
> field as QOM property. However, we have those duplicated for every integer
> size available.
>
> This is very cumbersome (and prone to bugs) to work with and extend, so let's
> strip out the only difference there is (the size) and generate the actual
> functions via a macro.
>
> Signed-off-by: Alexander Graf <agraf@suse.de>
>

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

> ---
>
> v1 -> v2:
>
>   - Rename DECLARE_INTEGER_VISITOR to DECLARE_PROP_SET_GET
>   - Make macro take name and type arguments, enabling generation of "bool"
>     types later
> ---
>  qom/property.c | 82 +++++++++++++++++-----------------------------------------
>  1 file changed, 24 insertions(+), 58 deletions(-)
>
> diff --git a/qom/property.c b/qom/property.c
> index 9e7c92a..944daff 100644
> --- a/qom/property.c
> +++ b/qom/property.c
> @@ -151,62 +151,28 @@ void object_property_add_bool(Object *obj, const char *name,
>      }
>  }
>
> -static void property_get_uint8_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint8_t value = *(uint8_t *)opaque;
> -    visit_type_uint8(v, &value, name, errp);
> -}
> -
> -static void property_get_uint16_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint16_t value = *(uint16_t *)opaque;
> -    visit_type_uint16(v, &value, name, errp);
> -}
> -
> -static void property_get_uint32_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint32_t value = *(uint32_t *)opaque;
> -    visit_type_uint32(v, &value, name, errp);
> -}
> -
> -static void property_get_uint64_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint64_t value = *(uint64_t *)opaque;
> -    visit_type_uint64(v, &value, name, errp);
> -}
> +#define DECLARE_PROP_SET_GET(name, valtype)                                    \
> +                                                                               \
> +static void glue(glue(property_get_,name),_ptr)(Object *obj, Visitor *v,       \
> +                                                void *opaque,                  \
> +                                                const char *name,              \
> +                                                Error **errp)                  \
> +{                                                                              \
> +    valtype value = *(valtype *)opaque;                                        \
> +    glue(visit_type_,name)(v, &value, name, errp);                             \
> +}                                                                              \
> +                                                                               \
> +void glue(glue(object_property_add_,name),_ptr)(Object *obj, const char *name, \
> +                                                const valtype *v,              \
> +                                                Error **errp)                  \
> +{                                                                              \
> +    ObjectPropertyAccessor *get = glue(glue(property_get_,name),_ptr);         \
> +    object_property_add(obj, name, stringify(name), get, NULL, NULL, (void *)v,\
> +                        errp);                                                 \
> +}                                                                              \
> +
> +DECLARE_PROP_SET_GET(uint8, uint8_t)
> +DECLARE_PROP_SET_GET(uint16, uint16_t)
> +DECLARE_PROP_SET_GET(uint32, uint32_t)
> +DECLARE_PROP_SET_GET(uint64, uint64_t)
>
> -void object_property_add_uint8_ptr(Object *obj, const char *name,
> -                                   const uint8_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint8", property_get_uint8_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> -
> -void object_property_add_uint16_ptr(Object *obj, const char *name,
> -                                    const uint16_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint16", property_get_uint16_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> -
> -void object_property_add_uint32_ptr(Object *obj, const char *name,
> -                                    const uint32_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint32", property_get_uint32_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> -
> -void object_property_add_uint64_ptr(Object *obj, const char *name,
> -                                    const uint64_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint64", property_get_uint64_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> --
> 1.8.1.4
>
>
diff mbox

Patch

diff --git a/qom/property.c b/qom/property.c
index 9e7c92a..944daff 100644
--- a/qom/property.c
+++ b/qom/property.c
@@ -151,62 +151,28 @@  void object_property_add_bool(Object *obj, const char *name,
     }
 }
 
-static void property_get_uint8_ptr(Object *obj, Visitor *v,
-                                   void *opaque, const char *name,
-                                   Error **errp)
-{
-    uint8_t value = *(uint8_t *)opaque;
-    visit_type_uint8(v, &value, name, errp);
-}
-
-static void property_get_uint16_ptr(Object *obj, Visitor *v,
-                                   void *opaque, const char *name,
-                                   Error **errp)
-{
-    uint16_t value = *(uint16_t *)opaque;
-    visit_type_uint16(v, &value, name, errp);
-}
-
-static void property_get_uint32_ptr(Object *obj, Visitor *v,
-                                   void *opaque, const char *name,
-                                   Error **errp)
-{
-    uint32_t value = *(uint32_t *)opaque;
-    visit_type_uint32(v, &value, name, errp);
-}
-
-static void property_get_uint64_ptr(Object *obj, Visitor *v,
-                                   void *opaque, const char *name,
-                                   Error **errp)
-{
-    uint64_t value = *(uint64_t *)opaque;
-    visit_type_uint64(v, &value, name, errp);
-}
+#define DECLARE_PROP_SET_GET(name, valtype)                                    \
+                                                                               \
+static void glue(glue(property_get_,name),_ptr)(Object *obj, Visitor *v,       \
+                                                void *opaque,                  \
+                                                const char *name,              \
+                                                Error **errp)                  \
+{                                                                              \
+    valtype value = *(valtype *)opaque;                                        \
+    glue(visit_type_,name)(v, &value, name, errp);                             \
+}                                                                              \
+                                                                               \
+void glue(glue(object_property_add_,name),_ptr)(Object *obj, const char *name, \
+                                                const valtype *v,              \
+                                                Error **errp)                  \
+{                                                                              \
+    ObjectPropertyAccessor *get = glue(glue(property_get_,name),_ptr);         \
+    object_property_add(obj, name, stringify(name), get, NULL, NULL, (void *)v,\
+                        errp);                                                 \
+}                                                                              \
+
+DECLARE_PROP_SET_GET(uint8, uint8_t)
+DECLARE_PROP_SET_GET(uint16, uint16_t)
+DECLARE_PROP_SET_GET(uint32, uint32_t)
+DECLARE_PROP_SET_GET(uint64, uint64_t)
 
-void object_property_add_uint8_ptr(Object *obj, const char *name,
-                                   const uint8_t *v, Error **errp)
-{
-    object_property_add(obj, name, "uint8", property_get_uint8_ptr,
-                        NULL, NULL, (void *)v, errp);
-}
-
-void object_property_add_uint16_ptr(Object *obj, const char *name,
-                                    const uint16_t *v, Error **errp)
-{
-    object_property_add(obj, name, "uint16", property_get_uint16_ptr,
-                        NULL, NULL, (void *)v, errp);
-}
-
-void object_property_add_uint32_ptr(Object *obj, const char *name,
-                                    const uint32_t *v, Error **errp)
-{
-    object_property_add(obj, name, "uint32", property_get_uint32_ptr,
-                        NULL, NULL, (void *)v, errp);
-}
-
-void object_property_add_uint64_ptr(Object *obj, const char *name,
-                                    const uint64_t *v, Error **errp)
-{
-    object_property_add(obj, name, "uint64", property_get_uint64_ptr,
-                        NULL, NULL, (void *)v, errp);
-}