From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42686) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yo8Bm-0003cy-IM for qemu-devel@nongnu.org; Fri, 01 May 2015 06:28:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yo8Bj-0001Xy-Bn for qemu-devel@nongnu.org; Fri, 01 May 2015 06:28:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36478) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yo8Bj-0001Xo-4n for qemu-devel@nongnu.org; Fri, 01 May 2015 06:28:55 -0400 Date: Fri, 1 May 2015 11:28:49 +0100 From: "Daniel P. Berrange" Message-ID: <20150501102849.GB11559@redhat.com> References: <1430408798-20914-1-git-send-email-berrange@redhat.com> <1430408798-20914-7-git-send-email-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1430408798-20914-7-git-send-email-berrange@redhat.com> Subject: Re: [Qemu-devel] [PATCH v2 6/7] qom: add a object_property_add_enum helper method Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Andreas =?utf-8?Q?F=C3=A4rber?= On Thu, Apr 30, 2015 at 04:46:37PM +0100, Daniel P. Berrange wrote: > A QOM property can be parsed as enum using the visit_type_enum() > helper method, but this forces callers to use the more complex > generic object_property_add() method when registering it. It > also requires that users of that object have access to the > string map when they want to read the property value. > > This patch introduces a specialized object_property_add_enum() > method which simplifies the use of enum properties, so the > setters/getters directly get passed the int value. > > typedef enum { > MYDEV_TYPE_FROG, > MYDEV_TYPE_ALLIGATOR, > MYDEV_TYPE_PLATYPUS, > > MYDEV_TYPE_LAST > } MyDevType; > > Then provide a table of enum <-> string mappings > > static const char *const mydevtypemap[MYDEV_TYPE_LAST + 1] = { > [MYDEV_TYPE_FROG] = "frog", > [MYDEV_TYPE_ALLIGATOR] = "alligator", > [MYDEV_TYPE_PLATYPUS] = "platypus", > [MYDEV_TYPE_LAST] = NULL, > }; > > Assuming an object struct of > > typedef struct { > Object parent; > MyDevType devtype; > ...other fields... > } MyDev; > > The property can then be registered as follows: > > static int mydev_prop_get_devtype(Object *obj, > Error **errp G_GNUC_UNUSED) > { > MyDev *dev = MYDEV(obj); > > return dev->devtype; > } > > static void mydev_prop_set_devtype(Object *obj, > int value, > Error **errp G_GNUC_UNUSED) > { > MyDev *dev = MYDEV(obj); > > dev->endpoint = value; > } > > object_property_add_enum(obj, "devtype", > mydevtypemap, "MyDevType", > mydev_prop_get_devtype, > mydev_prop_set_devtype, > NULL); > > Note there is no need to check the range of 'value' in > the setter, because the string->enum conversion code will > have already done that and reported an error as required. > > Signed-off-by: Daniel P. Berrange > --- > include/qom/object.h | 19 ++++++++++++ > qom/object.c | 58 ++++++++++++++++++++++++++++++++++++ > tests/check-qom-proplist.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 151 insertions(+) > diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c > index 9a02e4d..15f4933 100644 > --- a/tests/check-qom-proplist.c > +++ b/tests/check-qom-proplist.c > +static void test_dummy_badenum(void) > +{ > + Error *err = NULL; > + DummyObject *dobj = DUMMY_OBJECT( > + object_new_propv(TYPE_DUMMY, > + "/objects", > + "dummy0", > + &err, > + "bv", "yes", > + "sv", "Hiss hiss hiss", > + "av", "yeti", > + NULL)); Opps, this won't compile as I forgot to update the 2nd arg. Will send a v3 Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|