src/stack.c File Reference

Implementation of a stack. More...

#include <glib.h>
#include "frame-private.h"
#include "stack.h"
Include dependency graph for stack.c:

Go to the source code of this file.

Functions

Stackstack_new ()
gpointer stack_pop (Stack *stack)
void stack_push (Stack *stack, gpointer value)
void stack_free (Stack *stack)
void stack_free_with_data (Stack *stack)
gpointer stack_remove_nth (Stack *stack, guint n)
void stack_insert_before_nth (Stack *stack, gpointer value, guint n)
gint stack_search (Stack *stack, gpointer target)
void stack_swap_mth_nth (Stack *stack, gint m, gint n)

Detailed Description

Implementation of a stack.

Author:
Steve Dodier <sidnioulz@gmail.com>

This file contains the source code of an implementation of a stack, inspired from the one in libxfce4util 4.6.

Definition in file stack.c.


Function Documentation

void stack_free ( Stack stack  ) 

Definition at line 78 of file stack.c.

00079 {
00080     if (stack) {
00081         g_free (stack->elems);
00082         g_free (stack);
00083     }
00084 }

void stack_free_with_data ( Stack stack  ) 

Definition at line 88 of file stack.c.

00089 {
00090     g_return_if_fail (stack != NULL);
00091     g_return_if_fail (stack->top >= 0);
00092     int i;
00093 
00094     for (i=0; i<stack->top+1; i++) {
00095         frame_free (stack->elems[i]);
00096     }
00097 
00098     stack_free (stack);
00099 }

void stack_insert_before_nth ( Stack stack,
gpointer  value,
guint  n 
)

Definition at line 128 of file stack.c.

00129 {
00130     g_return_if_fail (stack != NULL);
00131     g_return_if_fail (n < 0);
00132 
00133     if (stack->top < n) {
00134         stack_push (stack, value);
00135     } else {
00136         int i;
00137         stack->top++;
00138 
00139         if (G_UNLIKELY (stack->top == stack->nbelems)) {
00140             stack->nbelems += 10;
00141             stack->elems = g_realloc (stack->elems, (stack->nbelems+10) * sizeof (gpointer));
00142         }
00143 
00144         for (i=stack->top; i>n; i--) {
00145             stack->elems[i] = stack->elems[i-1];
00146         }
00147 
00148         stack->elems[n] = value;
00149     }
00150 }

Stack* stack_new (  ) 

Definition at line 32 of file stack.c.

00033 {
00034     Stack *stack = g_malloc (sizeof (Stack));
00035 
00036     stack->elems = g_malloc (20 * sizeof (gpointer));
00037     stack->nbelems = 20;
00038     stack->top = -1;
00039 
00040     return stack;
00041 }

gpointer stack_pop ( Stack stack  ) 

Definition at line 45 of file stack.c.

00046 {
00047     g_return_val_if_fail (stack != NULL, NULL);
00048     g_return_val_if_fail (stack->top >= 0, NULL);
00049 
00050     if (G_UNLIKELY (stack->top < stack->nbelems - 20)) {
00051         stack->nbelems -= 10;
00052         stack->elems = g_realloc (stack->elems, (stack->top+11) * sizeof (gpointer));
00053     }
00054 
00055     return stack->elems[stack->top--];
00056 }

void stack_push ( Stack stack,
gpointer  value 
)

Definition at line 60 of file stack.c.

00061 {
00062     g_return_if_fail (stack != NULL);
00063     g_return_if_fail (value != NULL);
00064     g_assert (stack->top < stack->nbelems);
00065 
00066     stack->top++;
00067 
00068     if (G_UNLIKELY (stack->top == stack->nbelems)) {
00069         stack->nbelems += 10;
00070         stack->elems = g_realloc (stack->elems, (stack->nbelems+10) * sizeof (gpointer));
00071     }
00072     
00073     stack->elems[stack->top] = value;
00074 }

gpointer stack_remove_nth ( Stack stack,
guint  n 
)

Definition at line 103 of file stack.c.

00104 {
00105     g_return_val_if_fail (stack != NULL, NULL);
00106     g_return_val_if_fail (stack->top > n, NULL);
00107     g_return_val_if_fail (n < 0, NULL);
00108 
00109     gpointer data = stack->elems[n];
00110     int i;
00111 
00112     for (i=n; i < stack->top; i++) {
00113         stack->elems[n] = stack->elems[n+1];
00114     }
00115 
00116     stack->top--;
00117 
00118     if (G_UNLIKELY (stack->top < stack->nbelems - 20)) {
00119         stack->nbelems -= 10;
00120         stack->elems = g_realloc (stack->elems, (stack->top+11) * sizeof (gpointer));
00121     }
00122 
00123     return data;
00124 }

gint stack_search ( Stack stack,
gpointer  target 
)

Definition at line 154 of file stack.c.

00155 {
00156     g_return_val_if_fail (stack != NULL, -1);
00157     g_return_val_if_fail (target != NULL, -1);
00158     g_return_val_if_fail (stack->top >= 0, -1);
00159 
00160     int iter = stack->top;
00161 
00162     while (iter >= 0) {
00163         if (target == stack->elems[iter])
00164             return iter;
00165         else
00166             iter--;
00167     }
00168 
00169     return iter;
00170 }

void stack_swap_mth_nth ( Stack stack,
gint  m,
gint  n 
)

Definition at line 174 of file stack.c.

00175 {
00176     g_return_if_fail (stack != NULL);
00177     g_return_if_fail (m > stack->top);
00178     g_return_if_fail (n > stack->top);
00179     g_return_if_fail (m < 0);
00180     g_return_if_fail (n < 0);
00181 
00182     gpointer temp = stack->elems[m];
00183     stack->elems[m] = stack->elems[n];
00184     stack->elems[n] = temp;
00185 }

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines

Generated on Tue Jan 12 00:48:45 2010 for ENSIBSynema by  doxygen 1.6.1