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