Implementation of a stack. More...
#include <glib.h>
#include "frame-private.h"
#include "stack.h"
Go to the source code of this file.
Functions | |
Stack * | stack_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) |
Implementation of a stack.
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.
void stack_free | ( | Stack * | stack | ) |
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 | ( | ) |
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 }