pelib
2.0.0
|
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