Support added for building using a GNU toolchain on Win32,
[platform/upstream/glib.git] / gqueue.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1999 Free Software Foundation, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20
21 #ifdef HAVE_CONFIG_H
22 #  include <config.h>
23 #endif
24
25 #include <glib.h>
26
27
28
29
30 GQueue *
31 g_queue_new (void)
32 {
33   GQueue *q = g_new (GQueue, 1);
34
35   q->list = q->list_end = NULL;
36   q->list_size = 0;
37
38   return q;
39 }
40
41
42 void
43 g_queue_free (GQueue *q)
44 {
45   if (q)
46     {
47       if (q->list)
48         g_list_free (q->list);
49       g_free (q);
50     }
51 }
52
53
54 guint
55 g_queue_get_size (GQueue *q)
56 {
57   return (q == NULL) ? 0 : q->list_size;
58 }
59
60
61 void
62 g_queue_push_front (GQueue *q, gpointer data)
63 {
64   if (q)
65     {
66       q->list = g_list_prepend (q->list, data);
67
68       if (q->list_end == NULL)
69         q->list_end = q->list;
70
71       q->list_size++;
72     }
73 }
74
75
76 void
77 g_queue_push_back (GQueue *q, gpointer data)
78 {
79   if (q)
80     {
81       q->list_end = g_list_append (q->list_end, data);
82
83       if (! q->list)
84         q->list = q->list_end;
85       else
86         q->list_end = q->list_end->next;
87
88       q->list_size++;
89     }
90 }
91
92
93 gpointer
94 g_queue_pop_front (GQueue *q)
95 {
96   gpointer data = NULL;
97
98   if ((q) && (q->list))
99     {
100       GList *node;
101
102       node = q->list;
103       data = node->data;
104
105       if (! node->next)
106         {
107           q->list = q->list_end = NULL;
108           q->list_size = 0;
109         }
110       else
111         {
112           q->list = node->next;
113           q->list->prev = NULL;
114           q->list_size--;
115         }
116
117       g_list_free_1 (node);
118     }
119
120   return data;
121 }
122
123
124 gpointer
125 g_queue_pop_back (GQueue *q)
126 {
127   gpointer data = NULL;
128
129   if ((q) && (q->list))
130     {
131       GList *node;
132
133       node = q->list_end;
134       data = node->data;
135
136       if (! node->prev)
137         {
138           q->list = q->list_end = NULL;
139           q->list_size = 0;
140         }
141       else
142         {
143           q->list_end = node->prev;
144           q->list_end->next = NULL;
145           q->list_size--;
146         }
147
148       g_list_free_1 (node);
149     }
150
151   return data;
152 }
153
154