root / qlist.c @ d7582078
History | View | Annotate | Download (3 kB)
1 | a6fd08eb | Luiz Capitulino | /*
|
---|---|---|---|
2 | 41836a9f | Luiz Capitulino | * QList Module
|
3 | a6fd08eb | Luiz Capitulino | *
|
4 | a6fd08eb | Luiz Capitulino | * Copyright (C) 2009 Red Hat Inc.
|
5 | a6fd08eb | Luiz Capitulino | *
|
6 | a6fd08eb | Luiz Capitulino | * Authors:
|
7 | a6fd08eb | Luiz Capitulino | * Luiz Capitulino <lcapitulino@redhat.com>
|
8 | a6fd08eb | Luiz Capitulino | *
|
9 | 41836a9f | Luiz Capitulino | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
10 | 41836a9f | Luiz Capitulino | * See the COPYING.LIB file in the top-level directory.
|
11 | a6fd08eb | Luiz Capitulino | */
|
12 | 41836a9f | Luiz Capitulino | |
13 | a6fd08eb | Luiz Capitulino | #include "qlist.h" |
14 | a6fd08eb | Luiz Capitulino | #include "qobject.h" |
15 | a6fd08eb | Luiz Capitulino | #include "qemu-queue.h" |
16 | a6fd08eb | Luiz Capitulino | #include "qemu-common.h" |
17 | a6fd08eb | Luiz Capitulino | |
18 | a6fd08eb | Luiz Capitulino | static void qlist_destroy_obj(QObject *obj); |
19 | a6fd08eb | Luiz Capitulino | |
20 | a6fd08eb | Luiz Capitulino | static const QType qlist_type = { |
21 | a6fd08eb | Luiz Capitulino | .code = QTYPE_QLIST, |
22 | a6fd08eb | Luiz Capitulino | .destroy = qlist_destroy_obj, |
23 | a6fd08eb | Luiz Capitulino | }; |
24 | a6fd08eb | Luiz Capitulino | |
25 | a6fd08eb | Luiz Capitulino | /**
|
26 | a6fd08eb | Luiz Capitulino | * qlist_new(): Create a new QList
|
27 | a6fd08eb | Luiz Capitulino | *
|
28 | a6fd08eb | Luiz Capitulino | * Return strong reference.
|
29 | a6fd08eb | Luiz Capitulino | */
|
30 | a6fd08eb | Luiz Capitulino | QList *qlist_new(void)
|
31 | a6fd08eb | Luiz Capitulino | { |
32 | a6fd08eb | Luiz Capitulino | QList *qlist; |
33 | a6fd08eb | Luiz Capitulino | |
34 | 7267c094 | Anthony Liguori | qlist = g_malloc(sizeof(*qlist));
|
35 | a6fd08eb | Luiz Capitulino | QTAILQ_INIT(&qlist->head); |
36 | a6fd08eb | Luiz Capitulino | QOBJECT_INIT(qlist, &qlist_type); |
37 | a6fd08eb | Luiz Capitulino | |
38 | a6fd08eb | Luiz Capitulino | return qlist;
|
39 | a6fd08eb | Luiz Capitulino | } |
40 | a6fd08eb | Luiz Capitulino | |
41 | 033815fe | Anthony Liguori | static void qlist_copy_elem(QObject *obj, void *opaque) |
42 | 033815fe | Anthony Liguori | { |
43 | 033815fe | Anthony Liguori | QList *dst = opaque; |
44 | 033815fe | Anthony Liguori | |
45 | 033815fe | Anthony Liguori | qobject_incref(obj); |
46 | 033815fe | Anthony Liguori | qlist_append_obj(dst, obj); |
47 | 033815fe | Anthony Liguori | } |
48 | 033815fe | Anthony Liguori | |
49 | 033815fe | Anthony Liguori | QList *qlist_copy(QList *src) |
50 | 033815fe | Anthony Liguori | { |
51 | 033815fe | Anthony Liguori | QList *dst = qlist_new(); |
52 | 033815fe | Anthony Liguori | |
53 | 033815fe | Anthony Liguori | qlist_iter(src, qlist_copy_elem, dst); |
54 | 033815fe | Anthony Liguori | |
55 | 033815fe | Anthony Liguori | return dst;
|
56 | 033815fe | Anthony Liguori | } |
57 | 033815fe | Anthony Liguori | |
58 | a6fd08eb | Luiz Capitulino | /**
|
59 | a6fd08eb | Luiz Capitulino | * qlist_append_obj(): Append an QObject into QList
|
60 | a6fd08eb | Luiz Capitulino | *
|
61 | a6fd08eb | Luiz Capitulino | * NOTE: ownership of 'value' is transferred to the QList
|
62 | a6fd08eb | Luiz Capitulino | */
|
63 | a6fd08eb | Luiz Capitulino | void qlist_append_obj(QList *qlist, QObject *value)
|
64 | a6fd08eb | Luiz Capitulino | { |
65 | a6fd08eb | Luiz Capitulino | QListEntry *entry; |
66 | a6fd08eb | Luiz Capitulino | |
67 | 7267c094 | Anthony Liguori | entry = g_malloc(sizeof(*entry));
|
68 | a6fd08eb | Luiz Capitulino | entry->value = value; |
69 | a6fd08eb | Luiz Capitulino | |
70 | a6fd08eb | Luiz Capitulino | QTAILQ_INSERT_TAIL(&qlist->head, entry, next); |
71 | a6fd08eb | Luiz Capitulino | } |
72 | a6fd08eb | Luiz Capitulino | |
73 | a6fd08eb | Luiz Capitulino | /**
|
74 | a6fd08eb | Luiz Capitulino | * qlist_iter(): Iterate over all the list's stored values.
|
75 | a6fd08eb | Luiz Capitulino | *
|
76 | a6fd08eb | Luiz Capitulino | * This function allows the user to provide an iterator, which will be
|
77 | a6fd08eb | Luiz Capitulino | * called for each stored value in the list.
|
78 | a6fd08eb | Luiz Capitulino | */
|
79 | a6fd08eb | Luiz Capitulino | void qlist_iter(const QList *qlist, |
80 | a6fd08eb | Luiz Capitulino | void (*iter)(QObject *obj, void *opaque), void *opaque) |
81 | a6fd08eb | Luiz Capitulino | { |
82 | a6fd08eb | Luiz Capitulino | QListEntry *entry; |
83 | a6fd08eb | Luiz Capitulino | |
84 | a6fd08eb | Luiz Capitulino | QTAILQ_FOREACH(entry, &qlist->head, next) |
85 | a6fd08eb | Luiz Capitulino | iter(entry->value, opaque); |
86 | a6fd08eb | Luiz Capitulino | } |
87 | a6fd08eb | Luiz Capitulino | |
88 | 033815fe | Anthony Liguori | QObject *qlist_pop(QList *qlist) |
89 | 033815fe | Anthony Liguori | { |
90 | 033815fe | Anthony Liguori | QListEntry *entry; |
91 | 033815fe | Anthony Liguori | QObject *ret; |
92 | 033815fe | Anthony Liguori | |
93 | 033815fe | Anthony Liguori | if (qlist == NULL || QTAILQ_EMPTY(&qlist->head)) { |
94 | 033815fe | Anthony Liguori | return NULL; |
95 | 033815fe | Anthony Liguori | } |
96 | 033815fe | Anthony Liguori | |
97 | 033815fe | Anthony Liguori | entry = QTAILQ_FIRST(&qlist->head); |
98 | 033815fe | Anthony Liguori | QTAILQ_REMOVE(&qlist->head, entry, next); |
99 | 033815fe | Anthony Liguori | |
100 | 033815fe | Anthony Liguori | ret = entry->value; |
101 | 7267c094 | Anthony Liguori | g_free(entry); |
102 | 033815fe | Anthony Liguori | |
103 | 033815fe | Anthony Liguori | return ret;
|
104 | 033815fe | Anthony Liguori | } |
105 | 033815fe | Anthony Liguori | |
106 | 033815fe | Anthony Liguori | QObject *qlist_peek(QList *qlist) |
107 | 033815fe | Anthony Liguori | { |
108 | 033815fe | Anthony Liguori | QListEntry *entry; |
109 | 033815fe | Anthony Liguori | QObject *ret; |
110 | 033815fe | Anthony Liguori | |
111 | 033815fe | Anthony Liguori | if (qlist == NULL || QTAILQ_EMPTY(&qlist->head)) { |
112 | 033815fe | Anthony Liguori | return NULL; |
113 | 033815fe | Anthony Liguori | } |
114 | 033815fe | Anthony Liguori | |
115 | 033815fe | Anthony Liguori | entry = QTAILQ_FIRST(&qlist->head); |
116 | 033815fe | Anthony Liguori | |
117 | 033815fe | Anthony Liguori | ret = entry->value; |
118 | 033815fe | Anthony Liguori | |
119 | 033815fe | Anthony Liguori | return ret;
|
120 | 033815fe | Anthony Liguori | } |
121 | 033815fe | Anthony Liguori | |
122 | 033815fe | Anthony Liguori | int qlist_empty(const QList *qlist) |
123 | 033815fe | Anthony Liguori | { |
124 | 033815fe | Anthony Liguori | return QTAILQ_EMPTY(&qlist->head);
|
125 | 033815fe | Anthony Liguori | } |
126 | 033815fe | Anthony Liguori | |
127 | a6fd08eb | Luiz Capitulino | /**
|
128 | a6fd08eb | Luiz Capitulino | * qobject_to_qlist(): Convert a QObject into a QList
|
129 | a6fd08eb | Luiz Capitulino | */
|
130 | a6fd08eb | Luiz Capitulino | QList *qobject_to_qlist(const QObject *obj)
|
131 | a6fd08eb | Luiz Capitulino | { |
132 | a6fd08eb | Luiz Capitulino | if (qobject_type(obj) != QTYPE_QLIST) {
|
133 | a6fd08eb | Luiz Capitulino | return NULL; |
134 | a6fd08eb | Luiz Capitulino | } |
135 | a6fd08eb | Luiz Capitulino | |
136 | a6fd08eb | Luiz Capitulino | return container_of(obj, QList, base);
|
137 | a6fd08eb | Luiz Capitulino | } |
138 | a6fd08eb | Luiz Capitulino | |
139 | a6fd08eb | Luiz Capitulino | /**
|
140 | a6fd08eb | Luiz Capitulino | * qlist_destroy_obj(): Free all the memory allocated by a QList
|
141 | a6fd08eb | Luiz Capitulino | */
|
142 | a6fd08eb | Luiz Capitulino | static void qlist_destroy_obj(QObject *obj) |
143 | a6fd08eb | Luiz Capitulino | { |
144 | a6fd08eb | Luiz Capitulino | QList *qlist; |
145 | a6fd08eb | Luiz Capitulino | QListEntry *entry, *next_entry; |
146 | a6fd08eb | Luiz Capitulino | |
147 | a6fd08eb | Luiz Capitulino | assert(obj != NULL);
|
148 | a6fd08eb | Luiz Capitulino | qlist = qobject_to_qlist(obj); |
149 | a6fd08eb | Luiz Capitulino | |
150 | a6fd08eb | Luiz Capitulino | QTAILQ_FOREACH_SAFE(entry, &qlist->head, next, next_entry) { |
151 | a6fd08eb | Luiz Capitulino | QTAILQ_REMOVE(&qlist->head, entry, next); |
152 | a6fd08eb | Luiz Capitulino | qobject_decref(entry->value); |
153 | 7267c094 | Anthony Liguori | g_free(entry); |
154 | a6fd08eb | Luiz Capitulino | } |
155 | a6fd08eb | Luiz Capitulino | |
156 | 7267c094 | Anthony Liguori | g_free(qlist); |
157 | a6fd08eb | Luiz Capitulino | } |