Branch data Line data Source code
1 : : /* GLIB - Library of useful routines for C programming
2 : : * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald
3 : : *
4 : : * SPDX-License-Identifier: LGPL-2.1-or-later
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License as published by the Free Software Foundation; either
9 : : * version 2.1 of the License, or (at your option) any later version.
10 : : *
11 : : * This library is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : * Lesser General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU Lesser General Public
17 : : * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 : : */
19 : :
20 : : /*
21 : : * Modified by the GLib Team and others 1997-2000. See the AUTHORS
22 : : * file for a list of people on the GLib Team. See the ChangeLog
23 : : * files for a list of changes. These files are distributed with
24 : : * GLib at ftp://ftp.gtk.org/pub/gtk/.
25 : : */
26 : :
27 : : #include "config.h"
28 : :
29 : : /* we know we are deprecated here, no need for warnings */
30 : : #ifndef GLIB_DISABLE_DEPRECATION_WARNINGS
31 : : #define GLIB_DISABLE_DEPRECATION_WARNINGS
32 : : #endif
33 : :
34 : : #include "gtrashstack.h"
35 : :
36 : : /**
37 : : * GTrashStack:
38 : : * @next: pointer to the previous element of the stack,
39 : : * gets stored in the first `sizeof (gpointer)`
40 : : * bytes of the element
41 : : *
42 : : * A `GTrashStack` is an efficient way to keep a stack of unused allocated
43 : : * memory chunks. Each memory chunk is required to be large enough to hold
44 : : * a `gpointer`. This allows the stack to be maintained without any space
45 : : * overhead, since the stack pointers can be stored inside the memory chunks.
46 : : *
47 : : * There is no function to create a `GTrashStack`. A `NULL` `GTrashStack*`
48 : : * is a perfectly valid empty stack.
49 : : *
50 : : * Each piece of memory that is pushed onto the stack is cast to a
51 : : * `GTrashStack*`.
52 : : *
53 : : * There is no longer any good reason to use `GTrashStack`. If you have
54 : : * extra pieces of memory, `free()` them and allocate them again later.
55 : : *
56 : : * Deprecated: 2.48: `GTrashStack` is deprecated without replacement
57 : : */
58 : :
59 : : /**
60 : : * g_trash_stack_push:
61 : : * @stack_p: a #GTrashStack
62 : : * @data_p: (not nullable): the piece of memory to push on the stack
63 : : *
64 : : * Pushes a piece of memory onto a #GTrashStack.
65 : : * Deprecated: 2.48: #GTrashStack is deprecated without replacement
66 : : */
67 : : void
68 : 0 : g_trash_stack_push (GTrashStack **stack_p,
69 : : gpointer data_p)
70 : : {
71 : 0 : GTrashStack *data = (GTrashStack *) data_p;
72 : :
73 : 0 : data->next = *stack_p;
74 : 0 : *stack_p = data;
75 : 0 : }
76 : :
77 : : /**
78 : : * g_trash_stack_pop:
79 : : * @stack_p: a #GTrashStack
80 : : *
81 : : * Pops a piece of memory off a #GTrashStack.
82 : : *
83 : : * Returns: the element at the top of the stack
84 : : * Deprecated: 2.48: #GTrashStack is deprecated without replacement
85 : : */
86 : : gpointer
87 : 0 : g_trash_stack_pop (GTrashStack **stack_p)
88 : : {
89 : : GTrashStack *data;
90 : :
91 : 0 : data = *stack_p;
92 : 0 : if (data)
93 : : {
94 : 0 : *stack_p = data->next;
95 : : /* NULLify private pointer here, most platforms store NULL as
96 : : * subsequent 0 bytes
97 : : */
98 : 0 : data->next = NULL;
99 : : }
100 : :
101 : 0 : return data;
102 : : }
103 : :
104 : : /**
105 : : * g_trash_stack_peek:
106 : : * @stack_p: a #GTrashStack
107 : : *
108 : : * Returns the element at the top of a #GTrashStack
109 : : * which may be %NULL.
110 : : *
111 : : * Returns: the element at the top of the stack
112 : : * Deprecated: 2.48: #GTrashStack is deprecated without replacement
113 : : */
114 : : gpointer
115 : 0 : g_trash_stack_peek (GTrashStack **stack_p)
116 : : {
117 : : GTrashStack *data;
118 : :
119 : 0 : data = *stack_p;
120 : :
121 : 0 : return data;
122 : : }
123 : :
124 : : /**
125 : : * g_trash_stack_height:
126 : : * @stack_p: a #GTrashStack
127 : : *
128 : : * Returns the height of a #GTrashStack.
129 : : *
130 : : * Note that execution of this function is of O(N) complexity
131 : : * where N denotes the number of items on the stack.
132 : : *
133 : : * Returns: the height of the stack
134 : : * Deprecated: 2.48: #GTrashStack is deprecated without replacement
135 : : */
136 : : guint
137 : 0 : g_trash_stack_height (GTrashStack **stack_p)
138 : : {
139 : : GTrashStack *data;
140 : 0 : guint i = 0;
141 : :
142 : 0 : for (data = *stack_p; data; data = data->next)
143 : 0 : i++;
144 : :
145 : 0 : return i;
146 : : }
|