glib2.0/glib/gtrashstack.c

147 lines
3.9 KiB
C
Raw Normal View History

2022-06-29 16:02:05 +08:00
/* GLIB - Library of useful routines for C programming
* Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald
*
2023-02-14 16:00:02 +08:00
* SPDX-License-Identifier: LGPL-2.1-or-later
*
2022-06-29 16:02:05 +08:00
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
/*
* Modified by the GLib Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GLib Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GLib at ftp://ftp.gtk.org/pub/gtk/.
*/
#include "config.h"
/* we know we are deprecated here, no need for warnings */
2023-02-14 16:00:02 +08:00
#ifndef GLIB_DISABLE_DEPRECATION_WARNINGS
2022-06-29 16:02:05 +08:00
#define GLIB_DISABLE_DEPRECATION_WARNINGS
2023-02-14 16:00:02 +08:00
#endif
2022-06-29 16:02:05 +08:00
#include "gtrashstack.h"
/**
2024-05-23 15:55:40 +08:00
* GTrashStack:
* @next: pointer to the previous element of the stack,
* gets stored in the first `sizeof (gpointer)`
* bytes of the element
2022-06-29 16:02:05 +08:00
*
2024-05-23 15:55:40 +08:00
* A `GTrashStack` is an efficient way to keep a stack of unused allocated
2022-06-29 16:02:05 +08:00
* memory chunks. Each memory chunk is required to be large enough to hold
2024-05-23 15:55:40 +08:00
* a `gpointer`. This allows the stack to be maintained without any space
2022-06-29 16:02:05 +08:00
* overhead, since the stack pointers can be stored inside the memory chunks.
*
2024-05-23 15:55:40 +08:00
* There is no function to create a `GTrashStack`. A `NULL` `GTrashStack*`
2022-06-29 16:02:05 +08:00
* is a perfectly valid empty stack.
*
2024-05-23 15:55:40 +08:00
* Each piece of memory that is pushed onto the stack is cast to a
* `GTrashStack*`.
2022-06-29 16:02:05 +08:00
*
2024-05-23 15:55:40 +08:00
* There is no longer any good reason to use `GTrashStack`. If you have
* extra pieces of memory, `free()` them and allocate them again later.
2022-06-29 16:02:05 +08:00
*
2024-05-23 15:55:40 +08:00
* Deprecated: 2.48: `GTrashStack` is deprecated without replacement
2022-06-29 16:02:05 +08:00
*/
/**
* g_trash_stack_push:
* @stack_p: a #GTrashStack
* @data_p: (not nullable): the piece of memory to push on the stack
*
* Pushes a piece of memory onto a #GTrashStack.
* Deprecated: 2.48: #GTrashStack is deprecated without replacement
*/
void
g_trash_stack_push (GTrashStack **stack_p,
gpointer data_p)
{
GTrashStack *data = (GTrashStack *) data_p;
data->next = *stack_p;
*stack_p = data;
}
/**
* g_trash_stack_pop:
* @stack_p: a #GTrashStack
*
* Pops a piece of memory off a #GTrashStack.
*
* Returns: the element at the top of the stack
* Deprecated: 2.48: #GTrashStack is deprecated without replacement
*/
gpointer
g_trash_stack_pop (GTrashStack **stack_p)
{
GTrashStack *data;
data = *stack_p;
if (data)
{
*stack_p = data->next;
/* NULLify private pointer here, most platforms store NULL as
* subsequent 0 bytes
*/
data->next = NULL;
}
return data;
}
/**
* g_trash_stack_peek:
* @stack_p: a #GTrashStack
*
* Returns the element at the top of a #GTrashStack
* which may be %NULL.
*
* Returns: the element at the top of the stack
* Deprecated: 2.48: #GTrashStack is deprecated without replacement
*/
gpointer
g_trash_stack_peek (GTrashStack **stack_p)
{
GTrashStack *data;
data = *stack_p;
return data;
}
/**
* g_trash_stack_height:
* @stack_p: a #GTrashStack
*
* Returns the height of a #GTrashStack.
*
* Note that execution of this function is of O(N) complexity
* where N denotes the number of items on the stack.
*
* Returns: the height of the stack
* Deprecated: 2.48: #GTrashStack is deprecated without replacement
*/
guint
g_trash_stack_height (GTrashStack **stack_p)
{
GTrashStack *data;
guint i = 0;
for (data = *stack_p; data; data = data->next)
i++;
return i;
}