xref: /qemu/include/qobject/qlist.h (revision 407bc4bf9027f7ac4333e47cd900d773b99a23e3)
1a6fd08ebSLuiz Capitulino /*
241836a9fSLuiz Capitulino  * QList Module
3a6fd08ebSLuiz Capitulino  *
4a6fd08ebSLuiz Capitulino  * Copyright (C) 2009 Red Hat Inc.
5a6fd08ebSLuiz Capitulino  *
6a6fd08ebSLuiz Capitulino  * Authors:
7a6fd08ebSLuiz Capitulino  *  Luiz Capitulino <lcapitulino@redhat.com>
8a6fd08ebSLuiz Capitulino  *
941836a9fSLuiz Capitulino  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
1041836a9fSLuiz Capitulino  * See the COPYING.LIB file in the top-level directory.
11a6fd08ebSLuiz Capitulino  */
1241836a9fSLuiz Capitulino 
13a6fd08ebSLuiz Capitulino #ifndef QLIST_H
14a6fd08ebSLuiz Capitulino #define QLIST_H
15a6fd08ebSLuiz Capitulino 
16*407bc4bfSDaniel P. Berrangé #include "qobject/qobject.h"
171de7afc9SPaolo Bonzini #include "qemu/queue.h"
18a6fd08ebSLuiz Capitulino 
19a6fd08ebSLuiz Capitulino typedef struct QListEntry {
20a6fd08ebSLuiz Capitulino     QObject *value;
21a6fd08ebSLuiz Capitulino     QTAILQ_ENTRY(QListEntry) next;
22a6fd08ebSLuiz Capitulino } QListEntry;
23a6fd08ebSLuiz Capitulino 
249f5c734dSMarkus Armbruster struct QList {
253d3eacaeSMarc-André Lureau     struct QObjectBase_ base;
26a6fd08ebSLuiz Capitulino     QTAILQ_HEAD(,QListEntry) head;
279f5c734dSMarkus Armbruster };
28a6fd08ebSLuiz Capitulino 
29d709bbf3SMarc-André Lureau void qlist_unref(QList *q);
30d709bbf3SMarc-André Lureau 
31d709bbf3SMarc-André Lureau G_DEFINE_AUTOPTR_CLEANUP_FUNC(QList, qlist_unref)
32d709bbf3SMarc-André Lureau 
33a6fd08ebSLuiz Capitulino #define qlist_append(qlist, obj) \
34a6fd08ebSLuiz Capitulino         qlist_append_obj(qlist, QOBJECT(obj))
35a6fd08ebSLuiz Capitulino 
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 
4159eb1c85SLuiz Capitulino #define QLIST_FOREACH_ENTRY(qlist, var)                 \
4264594e2bSMarkus Armbruster         for ((var) = QTAILQ_FIRST(&(qlist)->head);      \
4359eb1c85SLuiz Capitulino              (var);                                     \
4464594e2bSMarkus Armbruster              (var) = QTAILQ_NEXT((var), next))
4559eb1c85SLuiz Capitulino 
qlist_entry_obj(const QListEntry * entry)4659eb1c85SLuiz Capitulino static inline QObject *qlist_entry_obj(const QListEntry *entry)
4759eb1c85SLuiz Capitulino {
4859eb1c85SLuiz Capitulino     return entry->value;
4959eb1c85SLuiz Capitulino }
5059eb1c85SLuiz Capitulino 
51a6fd08ebSLuiz Capitulino QList *qlist_new(void);
52033815feSAnthony Liguori QList *qlist_copy(QList *src);
53a6fd08ebSLuiz Capitulino void qlist_append_obj(QList *qlist, QObject *obj);
54033815feSAnthony Liguori QObject *qlist_pop(QList *qlist);
55033815feSAnthony Liguori QObject *qlist_peek(QList *qlist);
56033815feSAnthony Liguori int qlist_empty(const QList *qlist);
57a86a4c2fSMichael Roth size_t qlist_size(const QList *qlist);
58a6fd08ebSLuiz Capitulino 
qlist_first(const QList * qlist)5954d83804SMichael Roth static inline const QListEntry *qlist_first(const QList *qlist)
6054d83804SMichael Roth {
6154d83804SMichael Roth     return QTAILQ_FIRST(&qlist->head);
6254d83804SMichael Roth }
6354d83804SMichael Roth 
qlist_next(const QListEntry * entry)6454d83804SMichael Roth static inline const QListEntry *qlist_next(const QListEntry *entry)
6554d83804SMichael Roth {
6654d83804SMichael Roth     return QTAILQ_NEXT(entry, next);
6754d83804SMichael Roth }
6854d83804SMichael Roth 
69a6fd08ebSLuiz Capitulino #endif /* QLIST_H */
70