mirror of https://github.com/xemu-project/xemu.git
qobject: Eliminate qlist_iter(), use QLIST_FOREACH_ENTRY() instead
qlist_iter() has just three uses outside tests/. Replace by QLIST_FOREACH_ENTRY() for more concise code and less type punning. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200415083048.14339-4-armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
1cd7741ef1
commit
2f2ec11179
|
@ -47,8 +47,6 @@ static inline QObject *qlist_entry_obj(const QListEntry *entry)
|
||||||
QList *qlist_new(void);
|
QList *qlist_new(void);
|
||||||
QList *qlist_copy(QList *src);
|
QList *qlist_copy(QList *src);
|
||||||
void qlist_append_obj(QList *qlist, QObject *obj);
|
void qlist_append_obj(QList *qlist, QObject *obj);
|
||||||
void qlist_iter(const QList *qlist,
|
|
||||||
void (*iter)(QObject *obj, void *opaque), void *opaque);
|
|
||||||
QObject *qlist_pop(QList *qlist);
|
QObject *qlist_pop(QList *qlist);
|
||||||
QObject *qlist_peek(QList *qlist);
|
QObject *qlist_peek(QList *qlist);
|
||||||
int qlist_empty(const QList *qlist);
|
int qlist_empty(const QList *qlist);
|
||||||
|
|
|
@ -191,20 +191,6 @@ static void to_json_dict_iter(const char *key, QObject *obj, void *opaque)
|
||||||
s->count++;
|
s->count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void to_json_list_iter(QObject *obj, void *opaque)
|
|
||||||
{
|
|
||||||
ToJsonIterState *s = opaque;
|
|
||||||
|
|
||||||
if (s->count) {
|
|
||||||
qstring_append(s->str, s->pretty ? "," : ", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
json_pretty_newline(s->str, s->pretty, s->indent);
|
|
||||||
|
|
||||||
to_json(obj, s->str, s->pretty, s->indent);
|
|
||||||
s->count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
||||||
{
|
{
|
||||||
switch (qobject_type(obj)) {
|
switch (qobject_type(obj)) {
|
||||||
|
@ -289,15 +275,20 @@ static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QLIST: {
|
case QTYPE_QLIST: {
|
||||||
ToJsonIterState s;
|
|
||||||
QList *val = qobject_to(QList, obj);
|
QList *val = qobject_to(QList, obj);
|
||||||
|
const char *comma = pretty ? "," : ", ";
|
||||||
|
const char *sep = "";
|
||||||
|
QListEntry *entry;
|
||||||
|
|
||||||
s.count = 0;
|
|
||||||
s.str = str;
|
|
||||||
s.indent = indent + 1;
|
|
||||||
s.pretty = pretty;
|
|
||||||
qstring_append(str, "[");
|
qstring_append(str, "[");
|
||||||
qlist_iter(val, (void *)to_json_list_iter, &s);
|
|
||||||
|
QLIST_FOREACH_ENTRY(val, entry) {
|
||||||
|
qstring_append(str, sep);
|
||||||
|
json_pretty_newline(str, pretty, indent + 1);
|
||||||
|
to_json(qlist_entry_obj(entry), str, pretty, indent + 1);
|
||||||
|
sep = comma;
|
||||||
|
}
|
||||||
|
|
||||||
json_pretty_newline(str, pretty, indent);
|
json_pretty_newline(str, pretty, indent);
|
||||||
qstring_append(str, "]");
|
qstring_append(str, "]");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -34,20 +34,17 @@ QList *qlist_new(void)
|
||||||
return qlist;
|
return qlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qlist_copy_elem(QObject *obj, void *opaque)
|
|
||||||
{
|
|
||||||
QList *dst = opaque;
|
|
||||||
|
|
||||||
qobject_ref(obj);
|
|
||||||
qlist_append_obj(dst, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
QList *qlist_copy(QList *src)
|
QList *qlist_copy(QList *src)
|
||||||
{
|
{
|
||||||
QList *dst = qlist_new();
|
QList *dst = qlist_new();
|
||||||
|
QListEntry *entry;
|
||||||
|
QObject *elt;
|
||||||
|
|
||||||
qlist_iter(src, qlist_copy_elem, dst);
|
QLIST_FOREACH_ENTRY(src, entry) {
|
||||||
|
elt = qlist_entry_obj(entry);
|
||||||
|
qobject_ref(elt);
|
||||||
|
qlist_append_obj(dst, elt);
|
||||||
|
}
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,21 +83,6 @@ void qlist_append_null(QList *qlist)
|
||||||
qlist_append(qlist, qnull());
|
qlist_append(qlist, qnull());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* qlist_iter(): Iterate over all the list's stored values.
|
|
||||||
*
|
|
||||||
* This function allows the user to provide an iterator, which will be
|
|
||||||
* called for each stored value in the list.
|
|
||||||
*/
|
|
||||||
void qlist_iter(const QList *qlist,
|
|
||||||
void (*iter)(QObject *obj, void *opaque), void *opaque)
|
|
||||||
{
|
|
||||||
QListEntry *entry;
|
|
||||||
|
|
||||||
QTAILQ_FOREACH(entry, &qlist->head, next)
|
|
||||||
iter(entry->value, opaque);
|
|
||||||
}
|
|
||||||
|
|
||||||
QObject *qlist_pop(QList *qlist)
|
QObject *qlist_pop(QList *qlist)
|
||||||
{
|
{
|
||||||
QListEntry *entry;
|
QListEntry *entry;
|
||||||
|
@ -137,16 +119,14 @@ int qlist_empty(const QList *qlist)
|
||||||
return QTAILQ_EMPTY(&qlist->head);
|
return QTAILQ_EMPTY(&qlist->head);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qlist_size_iter(QObject *obj, void *opaque)
|
|
||||||
{
|
|
||||||
size_t *count = opaque;
|
|
||||||
(*count)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t qlist_size(const QList *qlist)
|
size_t qlist_size(const QList *qlist)
|
||||||
{
|
{
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
qlist_iter(qlist, qlist_size_iter, &count);
|
QListEntry *entry;
|
||||||
|
|
||||||
|
QLIST_FOREACH_ENTRY(qlist, entry) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,40 +61,31 @@ static void qobject_to_qlist_test(void)
|
||||||
qobject_unref(qlist);
|
qobject_unref(qlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iter_called;
|
|
||||||
static const int iter_max = 42;
|
|
||||||
|
|
||||||
static void iter_func(QObject *obj, void *opaque)
|
|
||||||
{
|
|
||||||
QNum *qi;
|
|
||||||
int64_t val;
|
|
||||||
|
|
||||||
g_assert(opaque == NULL);
|
|
||||||
|
|
||||||
qi = qobject_to(QNum, obj);
|
|
||||||
g_assert(qi != NULL);
|
|
||||||
|
|
||||||
g_assert(qnum_get_try_int(qi, &val));
|
|
||||||
g_assert_cmpint(val, >=, 0);
|
|
||||||
g_assert_cmpint(val, <=, iter_max);
|
|
||||||
|
|
||||||
iter_called++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void qlist_iter_test(void)
|
static void qlist_iter_test(void)
|
||||||
{
|
{
|
||||||
|
const int iter_max = 42;
|
||||||
int i;
|
int i;
|
||||||
QList *qlist;
|
QList *qlist;
|
||||||
|
QListEntry *entry;
|
||||||
|
QNum *qi;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
qlist = qlist_new();
|
qlist = qlist_new();
|
||||||
|
|
||||||
for (i = 0; i < iter_max; i++)
|
for (i = 0; i < iter_max; i++)
|
||||||
qlist_append_int(qlist, i);
|
qlist_append_int(qlist, i);
|
||||||
|
|
||||||
iter_called = 0;
|
i = 0;
|
||||||
qlist_iter(qlist, iter_func, NULL);
|
QLIST_FOREACH_ENTRY(qlist, entry) {
|
||||||
|
qi = qobject_to(QNum, qlist_entry_obj(entry));
|
||||||
|
g_assert(qi != NULL);
|
||||||
|
|
||||||
g_assert(iter_called == iter_max);
|
g_assert(qnum_get_try_int(qi, &val));
|
||||||
|
g_assert_cmpint(val, ==, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert(i == iter_max);
|
||||||
|
|
||||||
qobject_unref(qlist);
|
qobject_unref(qlist);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue