mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
Move GTrashStack out of gutils.[hc]
Reducing the mess in gutils, and moving docs inline at the same time. Double win.
This commit is contained in:
parent
6ab1c77270
commit
45f221c32f
1
docs/reference/glib/tmpl/.gitignore
vendored
1
docs/reference/glib/tmpl/.gitignore
vendored
@ -53,6 +53,7 @@ threads-deprecated.sgml
|
|||||||
threads.sgml
|
threads.sgml
|
||||||
timers.sgml
|
timers.sgml
|
||||||
timezone.sgml
|
timezone.sgml
|
||||||
|
trash_stack.sgml
|
||||||
trees-binary.sgml
|
trees-binary.sgml
|
||||||
trees-nary.sgml
|
trees-nary.sgml
|
||||||
unicode.sgml
|
unicode.sgml
|
||||||
|
@ -1,77 +0,0 @@
|
|||||||
<!-- ##### SECTION Title ##### -->
|
|
||||||
Trash Stacks
|
|
||||||
|
|
||||||
<!-- ##### SECTION Short_Description ##### -->
|
|
||||||
maintain a stack of unused allocated memory chunks
|
|
||||||
|
|
||||||
<!-- ##### SECTION Long_Description ##### -->
|
|
||||||
<para>
|
|
||||||
A #GTrashStack is an efficient way to keep a stack of unused allocated
|
|
||||||
memory chunks. Each memory chunk is required to be large enough to hold
|
|
||||||
a #gpointer. This allows the stack to be maintained without any space
|
|
||||||
overhead, since the stack pointers can be stored inside the memory chunks.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
There is no function to create a #GTrashStack. A %NULL #GTrashStack*
|
|
||||||
is a perfectly valid empty stack.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<!-- ##### SECTION See_Also ##### -->
|
|
||||||
<para>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<!-- ##### SECTION Stability_Level ##### -->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### SECTION Image ##### -->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### STRUCT GTrashStack ##### -->
|
|
||||||
<para>
|
|
||||||
Each piece of memory that is pushed onto the stack
|
|
||||||
is cast to a <structname>GTrashStack*</structname>.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@next: pointer to the previous element of the stack,
|
|
||||||
gets stored in the first <literal>sizeof (gpointer)</literal>
|
|
||||||
bytes of the element.
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_trash_stack_push ##### -->
|
|
||||||
<para>
|
|
||||||
Pushes a piece of memory onto a #GTrashStack.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@stack_p: a pointer to a #GTrashStack.
|
|
||||||
@data_p: the piece of memory to push on the stack.
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_trash_stack_pop ##### -->
|
|
||||||
<para>
|
|
||||||
Pops a piece of memory off a #GTrashStack.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@stack_p: a pointer to a #GTrashStack.
|
|
||||||
@Returns: the element at the top of the stack.
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_trash_stack_peek ##### -->
|
|
||||||
<para>
|
|
||||||
Returns the element at the top of a #GTrashStack which may be %NULL.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@stack_p: a pointer to a #GTrashStack.
|
|
||||||
@Returns: the element at the top of the stack.
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_trash_stack_height ##### -->
|
|
||||||
<para>
|
|
||||||
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.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@stack_p: a pointer to a #GTrashStack.
|
|
||||||
@Returns: the height of the stack.
|
|
||||||
|
|
||||||
|
|
@ -187,6 +187,7 @@ libglib_2_0_la_SOURCES = \
|
|||||||
gthreadpool.c \
|
gthreadpool.c \
|
||||||
gtimer.c \
|
gtimer.c \
|
||||||
gtimezone.c \
|
gtimezone.c \
|
||||||
|
gtrashstack.c \
|
||||||
gtree.c \
|
gtree.c \
|
||||||
guniprop.c \
|
guniprop.c \
|
||||||
gutf8.c \
|
gutf8.c \
|
||||||
@ -306,6 +307,7 @@ glibsubinclude_HEADERS = \
|
|||||||
gthreadpool.h \
|
gthreadpool.h \
|
||||||
gtimer.h \
|
gtimer.h \
|
||||||
gtimezone.h \
|
gtimezone.h \
|
||||||
|
gtrashstack.h \
|
||||||
gtree.h \
|
gtree.h \
|
||||||
gtypes.h \
|
gtypes.h \
|
||||||
gunicode.h \
|
gunicode.h \
|
||||||
|
@ -83,6 +83,7 @@
|
|||||||
#include <glib/gthreadpool.h>
|
#include <glib/gthreadpool.h>
|
||||||
#include <glib/gtimer.h>
|
#include <glib/gtimer.h>
|
||||||
#include <glib/gtimezone.h>
|
#include <glib/gtimezone.h>
|
||||||
|
#include <glib/gtrashstack.h>
|
||||||
#include <glib/gtree.h>
|
#include <glib/gtree.h>
|
||||||
#include <glib/gtypes.h>
|
#include <glib/gtypes.h>
|
||||||
#include <glib/gunicode.h>
|
#include <glib/gunicode.h>
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#include "gmem.h" /* gslice.h */
|
#include "gmem.h" /* gslice.h */
|
||||||
#include "gstrfuncs.h"
|
#include "gstrfuncs.h"
|
||||||
#include "gutils.h"
|
#include "gutils.h"
|
||||||
|
#include "gtrashstack.h"
|
||||||
#include "gtestutils.h"
|
#include "gtestutils.h"
|
||||||
#include "gthread.h"
|
#include "gthread.h"
|
||||||
#include "glib_trace.h"
|
#include "glib_trace.h"
|
||||||
|
94
glib/gtrashstack.c
Normal file
94
glib/gtrashstack.c
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* GLIB - Library of useful routines for C programming
|
||||||
|
* Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||||
|
*
|
||||||
|
* 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 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, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION:trash_stack
|
||||||
|
* @title: Trash Stacks
|
||||||
|
* @short_description: maintain a stack of unused allocated memory chunks
|
||||||
|
*
|
||||||
|
* A #GTrashStack is an efficient way to keep a stack of unused allocated
|
||||||
|
* memory chunks. Each memory chunk is required to be large enough to hold
|
||||||
|
* a #gpointer. This allows the stack to be maintained without any space
|
||||||
|
* overhead, since the stack pointers can be stored inside the memory chunks.
|
||||||
|
*
|
||||||
|
* There is no function to create a #GTrashStack. A %NULL #GTrashStack*
|
||||||
|
* is a perfectly valid empty stack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GTrashStack:
|
||||||
|
* @next: pointer to the previous element of the stack,
|
||||||
|
* gets stored in the first <literal>sizeof (gpointer)</literal>
|
||||||
|
* bytes of the element
|
||||||
|
*
|
||||||
|
* Each piece of memory that is pushed onto the stack
|
||||||
|
* is cast to a <structname>GTrashStack*</structname>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_trash_stack_push:
|
||||||
|
* @stack_p: a #GTrashStack
|
||||||
|
* @data_p: the piece of memory to push on the stack
|
||||||
|
*
|
||||||
|
* Pushes a piece of memory onto a #GTrashStack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define G_IMPLEMENT_INLINES 1
|
||||||
|
#define __G_TRASH_STACK_C__
|
||||||
|
#include "gtrashstack.h"
|
103
glib/gtrashstack.h
Normal file
103
glib/gtrashstack.h
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/* GLIB - Library of useful routines for C programming
|
||||||
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||||
|
*
|
||||||
|
* 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 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, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
|
||||||
|
#error "Only <glib.h> can be included directly."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __G_TRASH_STACK_H__
|
||||||
|
#define __G_TRASH_STACK_H__
|
||||||
|
|
||||||
|
#include <glib/gutils.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
typedef struct _GTrashStack GTrashStack;
|
||||||
|
struct _GTrashStack
|
||||||
|
{
|
||||||
|
GTrashStack *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p,
|
||||||
|
gpointer data_p);
|
||||||
|
G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p);
|
||||||
|
G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p);
|
||||||
|
G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p);
|
||||||
|
|
||||||
|
#if defined (G_CAN_INLINE) || defined (__G_TRASH_STACK_C__)
|
||||||
|
|
||||||
|
G_INLINE_FUNC void
|
||||||
|
g_trash_stack_push (GTrashStack **stack_p,
|
||||||
|
gpointer data_p)
|
||||||
|
{
|
||||||
|
GTrashStack *data = (GTrashStack *) data_p;
|
||||||
|
|
||||||
|
data->next = *stack_p;
|
||||||
|
*stack_p = data;
|
||||||
|
}
|
||||||
|
G_INLINE_FUNC 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_INLINE_FUNC gpointer
|
||||||
|
g_trash_stack_peek (GTrashStack **stack_p)
|
||||||
|
{
|
||||||
|
GTrashStack *data;
|
||||||
|
|
||||||
|
data = *stack_p;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
G_INLINE_FUNC guint
|
||||||
|
g_trash_stack_height (GTrashStack **stack_p)
|
||||||
|
{
|
||||||
|
GTrashStack *data;
|
||||||
|
guint i = 0;
|
||||||
|
|
||||||
|
for (data = *stack_p; data; data = data->next)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* G_CAN_INLINE || __G_TRASH_STACK_C__ */
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __G_UTILS_H__ */
|
@ -304,21 +304,6 @@ G_INLINE_FUNC gint g_bit_nth_msf (gulong mask,
|
|||||||
gint nth_bit) G_GNUC_CONST;
|
gint nth_bit) G_GNUC_CONST;
|
||||||
G_INLINE_FUNC guint g_bit_storage (gulong number) G_GNUC_CONST;
|
G_INLINE_FUNC guint g_bit_storage (gulong number) G_GNUC_CONST;
|
||||||
|
|
||||||
/* Trash Stacks
|
|
||||||
* elements need to be >= sizeof (gpointer)
|
|
||||||
*/
|
|
||||||
typedef struct _GTrashStack GTrashStack;
|
|
||||||
struct _GTrashStack
|
|
||||||
{
|
|
||||||
GTrashStack *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p,
|
|
||||||
gpointer data_p);
|
|
||||||
G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p);
|
|
||||||
G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p);
|
|
||||||
G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p);
|
|
||||||
|
|
||||||
/* inline function implementations
|
/* inline function implementations
|
||||||
*/
|
*/
|
||||||
#if defined (G_CAN_INLINE) || defined (__G_UTILS_C__)
|
#if defined (G_CAN_INLINE) || defined (__G_UTILS_C__)
|
||||||
@ -368,52 +353,6 @@ g_bit_storage (gulong number)
|
|||||||
return n_bits;
|
return n_bits;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
G_INLINE_FUNC void
|
|
||||||
g_trash_stack_push (GTrashStack **stack_p,
|
|
||||||
gpointer data_p)
|
|
||||||
{
|
|
||||||
GTrashStack *data = (GTrashStack *) data_p;
|
|
||||||
|
|
||||||
data->next = *stack_p;
|
|
||||||
*stack_p = data;
|
|
||||||
}
|
|
||||||
G_INLINE_FUNC 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_INLINE_FUNC gpointer
|
|
||||||
g_trash_stack_peek (GTrashStack **stack_p)
|
|
||||||
{
|
|
||||||
GTrashStack *data;
|
|
||||||
|
|
||||||
data = *stack_p;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
G_INLINE_FUNC guint
|
|
||||||
g_trash_stack_height (GTrashStack **stack_p)
|
|
||||||
{
|
|
||||||
GTrashStack *data;
|
|
||||||
guint i = 0;
|
|
||||||
|
|
||||||
for (data = *stack_p; data; data = data->next)
|
|
||||||
i++;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
#endif /* G_CAN_INLINE || __G_UTILS_C__ */
|
#endif /* G_CAN_INLINE || __G_UTILS_C__ */
|
||||||
|
|
||||||
/* Glib version.
|
/* Glib version.
|
||||||
|
Loading…
Reference in New Issue
Block a user