1 | /* |
2 | * QList Module |
3 | * |
4 | * Copyright (C) 2009 Red Hat Inc. |
5 | * |
6 | * Authors: |
7 | * Luiz Capitulino <lcapitulino@redhat.com> |
8 | * |
9 | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
10 | * See the COPYING.LIB file in the top-level directory. |
11 | */ |
12 | |
13 | #ifndef QLIST_H |
14 | #define QLIST_H |
15 | |
16 | #include "qapi/qmp/qobject.h" |
17 | #include "qemu/queue.h" |
18 | |
19 | typedef struct QListEntry { |
20 | QObject *value; |
21 | QTAILQ_ENTRY(QListEntry) next; |
22 | } QListEntry; |
23 | |
24 | struct QList { |
25 | struct QObjectBase_ base; |
26 | QTAILQ_HEAD(,QListEntry) head; |
27 | }; |
28 | |
29 | #define qlist_append(qlist, obj) \ |
30 | qlist_append_obj(qlist, QOBJECT(obj)) |
31 | |
32 | void qlist_append_bool(QList *qlist, bool value); |
33 | void qlist_append_int(QList *qlist, int64_t value); |
34 | void qlist_append_null(QList *qlist); |
35 | void qlist_append_str(QList *qlist, const char *value); |
36 | |
37 | #define QLIST_FOREACH_ENTRY(qlist, var) \ |
38 | for ((var) = ((qlist)->head.tqh_first); \ |
39 | (var); \ |
40 | (var) = ((var)->next.tqe_next)) |
41 | |
42 | static inline QObject *qlist_entry_obj(const QListEntry *entry) |
43 | { |
44 | return entry->value; |
45 | } |
46 | |
47 | QList *qlist_new(void); |
48 | QList *qlist_copy(QList *src); |
49 | void qlist_append_obj(QList *qlist, QObject *obj); |
50 | void qlist_iter(const QList *qlist, |
51 | void (*iter)(QObject *obj, void *opaque), void *opaque); |
52 | QObject *qlist_pop(QList *qlist); |
53 | QObject *qlist_peek(QList *qlist); |
54 | int qlist_empty(const QList *qlist); |
55 | size_t qlist_size(const QList *qlist); |
56 | bool qlist_is_equal(const QObject *x, const QObject *y); |
57 | void qlist_destroy_obj(QObject *obj); |
58 | |
59 | static inline const QListEntry *qlist_first(const QList *qlist) |
60 | { |
61 | return QTAILQ_FIRST(&qlist->head); |
62 | } |
63 | |
64 | static inline const QListEntry *qlist_next(const QListEntry *entry) |
65 | { |
66 | return QTAILQ_NEXT(entry, next); |
67 | } |
68 | |
69 | #endif /* QLIST_H */ |
70 | |