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:
Matthias Clasen 2011-10-16 16:52:24 -04:00
parent 6ab1c77270
commit 45f221c32f
8 changed files with 202 additions and 138 deletions

View File

@ -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

View File

@ -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.

View File

@ -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 \

View File

@ -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>

View File

@ -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
View 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
View 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__ */

View File

@ -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.