1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef QLIST_H
14#define QLIST_H
15
16#include "qapi/qmp/qobject.h"
17#include "qapi/qmp/qnum.h"
18#include "qapi/qmp/qnull.h"
19#include "qemu/queue.h"
20
21typedef struct QListEntry {
22 QObject *value;
23 QTAILQ_ENTRY(QListEntry) next;
24} QListEntry;
25
26typedef struct QList {
27 QObject base;
28 QTAILQ_HEAD(,QListEntry) head;
29} QList;
30
31#define qlist_append(qlist, obj) \
32 qlist_append_obj(qlist, QOBJECT(obj))
33
34
35#define qlist_append_int(qlist, value) \
36 qlist_append(qlist, qnum_from_int(value))
37#define qlist_append_bool(qlist, value) \
38 qlist_append(qlist, qbool_from_bool(value))
39#define qlist_append_str(qlist, value) \
40 qlist_append(qlist, qstring_from_str(value))
41#define qlist_append_null(qlist) \
42 qlist_append(qlist, qnull())
43
44#define QLIST_FOREACH_ENTRY(qlist, var) \
45 for ((var) = ((qlist)->head.tqh_first); \
46 (var); \
47 (var) = ((var)->next.tqe_next))
48
49static inline QObject *qlist_entry_obj(const QListEntry *entry)
50{
51 return entry->value;
52}
53
54QList *qlist_new(void);
55QList *qlist_copy(QList *src);
56void qlist_append_obj(QList *qlist, QObject *obj);
57void qlist_iter(const QList *qlist,
58 void (*iter)(QObject *obj, void *opaque), void *opaque);
59QObject *qlist_pop(QList *qlist);
60QObject *qlist_peek(QList *qlist);
61int qlist_empty(const QList *qlist);
62size_t qlist_size(const QList *qlist);
63QList *qobject_to_qlist(const QObject *obj);
64bool qlist_is_equal(const QObject *x, const QObject *y);
65void qlist_destroy_obj(QObject *obj);
66
67static inline const QListEntry *qlist_first(const QList *qlist)
68{
69 return QTAILQ_FIRST(&qlist->head);
70}
71
72static inline const QListEntry *qlist_next(const QListEntry *entry)
73{
74 return QTAILQ_NEXT(entry, next);
75}
76
77#endif
78