Statistics
| Branch: | Revision:

root / qlist.c @ a74cdab4

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 a6fd08eb Luiz Capitulino
    qlist = qemu_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 a6fd08eb Luiz Capitulino
    entry = qemu_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 033815fe Anthony Liguori
    qemu_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 a6fd08eb Luiz Capitulino
        qemu_free(entry);
154 a6fd08eb Luiz Capitulino
    }
155 a6fd08eb Luiz Capitulino
156 a6fd08eb Luiz Capitulino
    qemu_free(qlist);
157 a6fd08eb Luiz Capitulino
}