xref: /openbmc/qemu/include/qapi/qmp/qlist.h (revision 1be5a765c08cee3a9587c8a8d3fc2ea247b13f9c)
17b1b5d19SPaolo Bonzini /*
27b1b5d19SPaolo Bonzini  * QList Module
37b1b5d19SPaolo Bonzini  *
47b1b5d19SPaolo Bonzini  * Copyright (C) 2009 Red Hat Inc.
57b1b5d19SPaolo Bonzini  *
67b1b5d19SPaolo Bonzini  * Authors:
77b1b5d19SPaolo Bonzini  *  Luiz Capitulino <lcapitulino@redhat.com>
87b1b5d19SPaolo Bonzini  *
97b1b5d19SPaolo Bonzini  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
107b1b5d19SPaolo Bonzini  * See the COPYING.LIB file in the top-level directory.
117b1b5d19SPaolo Bonzini  */
127b1b5d19SPaolo Bonzini 
137b1b5d19SPaolo Bonzini #ifndef QLIST_H
147b1b5d19SPaolo Bonzini #define QLIST_H
157b1b5d19SPaolo Bonzini 
167b1b5d19SPaolo Bonzini #include "qapi/qmp/qobject.h"
171de7afc9SPaolo Bonzini #include "qemu/queue.h"
187b1b5d19SPaolo Bonzini 
197b1b5d19SPaolo Bonzini typedef struct QListEntry {
207b1b5d19SPaolo Bonzini     QObject *value;
217b1b5d19SPaolo Bonzini     QTAILQ_ENTRY(QListEntry) next;
227b1b5d19SPaolo Bonzini } QListEntry;
237b1b5d19SPaolo Bonzini 
249f5c734dSMarkus Armbruster struct QList {
253d3eacaeSMarc-André Lureau     struct QObjectBase_ base;
267b1b5d19SPaolo Bonzini     QTAILQ_HEAD(,QListEntry) head;
279f5c734dSMarkus Armbruster };
287b1b5d19SPaolo Bonzini 
29*d709bbf3SMarc-André Lureau void qlist_unref(QList *q);
30*d709bbf3SMarc-André Lureau 
31*d709bbf3SMarc-André Lureau G_DEFINE_AUTOPTR_CLEANUP_FUNC(QList, qlist_unref)
32*d709bbf3SMarc-André Lureau 
337b1b5d19SPaolo Bonzini #define qlist_append(qlist, obj) \
347b1b5d19SPaolo Bonzini         qlist_append_obj(qlist, QOBJECT(obj))
357b1b5d19SPaolo Bonzini 
3615280c36SMarkus Armbruster void qlist_append_bool(QList *qlist, bool value);
3715280c36SMarkus Armbruster void qlist_append_int(QList *qlist, int64_t value);
3815280c36SMarkus Armbruster void qlist_append_null(QList *qlist);
3915280c36SMarkus Armbruster void qlist_append_str(QList *qlist, const char *value);
40a92c2159SEric Blake 
417b1b5d19SPaolo Bonzini #define QLIST_FOREACH_ENTRY(qlist, var)                 \
4264594e2bSMarkus Armbruster         for ((var) = QTAILQ_FIRST(&(qlist)->head);      \
437b1b5d19SPaolo Bonzini              (var);                                     \
4464594e2bSMarkus Armbruster              (var) = QTAILQ_NEXT((var), next))
457b1b5d19SPaolo Bonzini 
qlist_entry_obj(const QListEntry * entry)467b1b5d19SPaolo Bonzini static inline QObject *qlist_entry_obj(const QListEntry *entry)
477b1b5d19SPaolo Bonzini {
487b1b5d19SPaolo Bonzini     return entry->value;
497b1b5d19SPaolo Bonzini }
507b1b5d19SPaolo Bonzini 
517b1b5d19SPaolo Bonzini QList *qlist_new(void);
527b1b5d19SPaolo Bonzini QList *qlist_copy(QList *src);
537b1b5d19SPaolo Bonzini void qlist_append_obj(QList *qlist, QObject *obj);
547b1b5d19SPaolo Bonzini QObject *qlist_pop(QList *qlist);
557b1b5d19SPaolo Bonzini QObject *qlist_peek(QList *qlist);
567b1b5d19SPaolo Bonzini int qlist_empty(const QList *qlist);
577b1b5d19SPaolo Bonzini size_t qlist_size(const QList *qlist);
587b1b5d19SPaolo Bonzini 
qlist_first(const QList * qlist)597b1b5d19SPaolo Bonzini static inline const QListEntry *qlist_first(const QList *qlist)
607b1b5d19SPaolo Bonzini {
617b1b5d19SPaolo Bonzini     return QTAILQ_FIRST(&qlist->head);
627b1b5d19SPaolo Bonzini }
637b1b5d19SPaolo Bonzini 
qlist_next(const QListEntry * entry)647b1b5d19SPaolo Bonzini static inline const QListEntry *qlist_next(const QListEntry *entry)
657b1b5d19SPaolo Bonzini {
667b1b5d19SPaolo Bonzini     return QTAILQ_NEXT(entry, next);
677b1b5d19SPaolo Bonzini }
687b1b5d19SPaolo Bonzini 
697b1b5d19SPaolo Bonzini #endif /* QLIST_H */
70