pelib  2.0.0
include/pelib/stack.h
Go to the documentation of this file.
00001 /*
00002  * stack.h
00003  *
00004  *  Created on: 18 Oct 2011
00005  *  Copyright 2011 Nicolas Melot
00006  *
00007  * This file is part of pelib.
00008  * 
00009  *     pelib is free software: you can redistribute it and/or modify
00010  *     it under the terms of the GNU General Public License as published by
00011  *     the Free Software Foundation, either version 3 of the License, or
00012  *     (at your option) any later version.
00013  * 
00014  *     pelib is distributed in the hope that it will be useful,
00015  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  *     GNU General Public License for more details.
00018  * 
00019  *     You should have received a copy of the GNU General Public License
00020  *     along with pelib. If not, see <http://www.gnu.org/licenses/>.
00021  * 
00022  */
00023 
00024 #include <pthread.h>
00025 
00026 #include <pelib/template.h>
00027 
00028 #ifndef STACK_T
00029 #error Using generic stack without a type
00030 #endif
00031 
00032 #if PELIB_CONCAT_2(DONE_stack_, STACK_T) == 0
00033 
00034 #define stackelem(elem) PELIB_CONCAT_2(stackelem_, elem)
00035 #define stackelem_t(elem) PELIB_CONCAT_2(stackelem(elem), _t)
00036 
00037 #define pelib_stackelem_write(elem) PELIB_CONCAT_3(pelib_, stackelem(elem), _write)
00038 #define pelib_stackelem_read(elem) PELIB_CONCAT_3(pelib_, stackelem(elem), _read)
00039 #define pelib_stackelem_check(elem) PELIB_CONCAT_3(pelib_, stackelem(elem), _check)
00040 
00041 #define stack(elem) PELIB_CONCAT_2(stack_, elem)
00042 #define stack_t(elem) PELIB_CONCAT_2(stack(elem), _t)
00043 
00044 #define pelib_stack_check(elem) PELIB_CONCAT_3(pelib_, stack(elem), _check)
00045 #define pelib_stack_isempty(elem) PELIB_CONCAT_3(pelib_, stack(elem), _isempty)
00046 #define pelib_stack_push(elem) PELIB_CONCAT_3(pelib_, stack(elem), _push)
00047 #define pelib_stack_pop(elem) PELIB_CONCAT_3(pelib_, stack(elem), _pop)
00048 #define pelib_stack_peek(elem) PELIB_CONCAT_3(pelib_, stack(elem), _peek)
00049 #define pelib_stack_push_safe(elem) PELIB_CONCAT_3(pelib_, stack(elem), _push_safe)
00050 #define pelib_stack_pop_safe(elem) PELIB_CONCAT_3(pelib_, stack(elem), _pop_safe)
00051 #define pelib_stack_push_elem(elem) PELIB_CONCAT_3(pelib_, stack(elem), _push_elem)
00052 #define pelib_stack_pop_elem(elem) PELIB_CONCAT_3(pelib_, stack(elem), _pop_elem)
00053 #define pelib_stack_push_elem_safe(elem) PELIB_CONCAT_3(pelib_, stack(elem), _push_elem_safe)
00054 #define pelib_stack_pop_elem_safe(elem) PELIB_CONCAT_3(pelib_, stack(elem), _pop_elem_safe)
00055 #define pelib_stack_push_safe_managed(elem) PELIB_CONCAT_3(pelib_, stack(elem), _push_safe_managed)
00056 #define pelib_stack_pop_safe_managed(elem) PELIB_CONCAT_3(pelib_, stack(elem), _pop_safe_managed)
00057 
00059 struct
00060 stackelem(STACK_T)
00061   {
00062     STACK_T buffer;
00063     struct stackelem(STACK_T) *next;
00064   };
00066 typedef struct stackelem(STACK_T) stackelem_t(STACK_T);
00067 
00068 #define STRUCT_T stackelem_t(STACK_T)
00069 #include <pelib/structure.h>
00070 
00072 int
00073 pelib_stackelem_write(STACK_T)(stackelem_t(STACK_T)*, STACK_T);
00074 
00076 int
00077 pelib_stackelem_read(STACK_T)(stackelem_t(STACK_T)*, STACK_T*);
00078 
00080 int
00081 pelib_stackelem_check(STACK_T)(stackelem_t(STACK_T)*);
00082 
00084 struct stack(STACK_T)
00085   {
00086     stackelem_t(STACK_T) * top;
00087     pthread_mutex_t lock;
00088   };
00090 typedef struct stack(STACK_T) stack_t(STACK_T);
00091 
00092 #define STRUCT_T stack_t(STACK_T)
00093 #include <pelib/structure.h>
00094 
00096 int
00097 pelib_stack_check(STACK_T)(stack_t(STACK_T) *);
00098 
00100 int
00101 pelib_stack_isempty(STACK_T)(stack_t(STACK_T) *);
00102 
00104 int
00105 pelib_stack_push(STACK_T)(stack_t(STACK_T) *stack, STACK_T data);
00106 
00108 int
00109 pelib_stack_pop(STACK_T)(stack_t(STACK_T) *, STACK_T*);
00110 
00112 int
00113 pelib_stack_peek(STACK_T)(stack_t(STACK_T) *, STACK_T*);
00114 
00116 int
00117 pelib_stack_push_safe(STACK_T)(stack_t(STACK_T) *, STACK_T);
00118 
00120 int
00121 pelib_stack_pop_safe(STACK_T)(stack_t(STACK_T) *, STACK_T*);
00122 
00124 int
00125 pelib_stack_push_elem(STACK_T)(stack_t(STACK_T) *, stackelem_t(STACK_T)*);
00126 
00128 int
00129 pelib_stack_pop_elem(STACK_T)(stack_t(STACK_T) *, stackelem_t(STACK_T)**);
00130 
00132 int
00133 pelib_stack_push_elem_safe(STACK_T)(stack_t(STACK_T) *, stackelem_t(STACK_T) *);
00134 
00136 int
00137 pelib_stack_pop_elem_safe(STACK_T)(stack_t(STACK_T) *, stackelem_t(STACK_T)**);
00138 
00145 int
00146 pelib_stack_push_safe_managed(STACK_T)(stack_t(STACK_T) *stack, stack_t(STACK_T) *bin, STACK_T value);
00147 
00153 int
00154 pelib_stack_pop_safe_managed(STACK_T)(stack_t(STACK_T) *stack, stack_t(STACK_T) *bin, STACK_T *ptr);
00155 
00156 #endif
00157 
00158 // Make sure the symbol does not propagate any further
00159 #undef STACK_T