pelib
2.0.0
|
00001 /* 00002 * fifo.h 00003 * 00004 * Created on: 26 Jan 2012 00005 * Copyright 2012 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 <stddef.h> 00025 00026 #include <pelib/template.h> 00027 00028 #ifndef FIFO_H 00029 #define FIFO_H 00030 00032 enum pelib_fifo_operation 00033 { 00034 PELIB_CFIFO_PUSH, 00035 PELIB_CFIFO_POP 00036 }; 00037 typedef enum pelib_fifo_operation pelib_fifo_operation_t; 00038 #endif 00039 00040 #if PELIB_CONCAT_2(DONE_cfifo_, CFIFO_T) == 0 00041 00042 #define cfifo(elem) PELIB_CONCAT_2(cfifo_, elem) 00043 #define cfifo_t(elem) PELIB_CONCAT_2(cfifo(elem), _t) 00044 00045 #define pelib_cfifo_push(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _push) 00046 #define pelib_cfifo_fill(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _fill) 00047 #define pelib_cfifo_pop(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _pop) 00048 #define pelib_cfifo_discard(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _discard) 00049 #define pelib_cfifo_peek(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _peek) 00050 #define pelib_cfifo_last(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _last) 00051 #define pelib_cfifo_is_full(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _is_full) 00052 #define pelib_cfifo_is_empty(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _is_empty) 00053 #define pelib_cfifo_string_content(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _string_content) 00054 #define pelib_cfifo_printf_content(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _printf_content) 00055 #define pelib_cfifo_pushmem(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _pushmem) 00056 #define pelib_cfifo_popmem(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _popmem) 00057 #define pelib_cfifo_peekmem(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _peekmem) 00058 #define pelib_cfifo_peekaddr(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _peekaddr) 00059 #define pelib_cfifo_writeaddr(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _writeaddr) 00060 #define pelib_cfifo_popfifo(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _popfifo) 00061 #define pelib_cfifo_length(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _length) 00062 #define pelib_cfifo_last(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _last) 00063 #define pelib_cfifo_capacity(elem) PELIB_CONCAT_3(pelib_, cfifo(elem), _capacity) 00064 00066 struct cfifo(CFIFO_T) 00067 { 00068 size_t read; 00069 size_t write; 00070 pelib_fifo_operation_t last_op; 00071 size_t capacity; 00072 volatile CFIFO_T *buffer; 00073 }; 00074 typedef struct cfifo(CFIFO_T) cfifo_t(CFIFO_T); 00075 00076 #define STRUCT_T cfifo_t(CFIFO_T) 00077 #include <pelib/structure.h> 00078 00079 #define PELIB_FIFO_ELEM_MAX_CHAR 11 00080 00082 int 00083 pelib_cfifo_push(CFIFO_T)(cfifo_t(CFIFO_T)*, CFIFO_T); 00084 size_t 00086 pelib_cfifo_fill(CFIFO_T)(cfifo_t(CFIFO_T)*, size_t n); 00087 00089 CFIFO_T 00090 pelib_cfifo_pop(CFIFO_T)(cfifo_t(CFIFO_T)*); 00091 00093 size_t 00094 pelib_cfifo_discard(CFIFO_T)(cfifo_t(CFIFO_T)*, size_t n); 00095 00099 CFIFO_T 00100 pelib_cfifo_peek(CFIFO_T)(cfifo_t(CFIFO_T)*, size_t offset); 00101 00103 CFIFO_T* 00104 pelib_cfifo_peekaddr(CFIFO_T)(cfifo_t(CFIFO_T)*, size_t offset, size_t *num, CFIFO_T **remaining); 00105 00107 CFIFO_T* 00108 pelib_cfifo_writeaddr(CFIFO_T)(cfifo_t(CFIFO_T)*, size_t *num, CFIFO_T **remaining); 00109 00111 int 00112 pelib_cfifo_is_full(CFIFO_T)(cfifo_t(CFIFO_T)*); 00113 00115 int 00116 pelib_cfifo_is_empty(CFIFO_T)(cfifo_t(CFIFO_T)*); 00117 00123 size_t 00124 pelib_cfifo_pushmem(CFIFO_T)(cfifo_t(CFIFO_T)*, CFIFO_T* addr, size_t n); 00125 00131 size_t 00132 pelib_cfifo_popmem(CFIFO_T)(cfifo_t(CFIFO_T)*, CFIFO_T* addr, size_t n); 00133 00139 size_t 00140 pelib_cfifo_peekmem(CFIFO_T)(cfifo_t(CFIFO_T)*, CFIFO_T*, size_t n, size_t offset); 00141 00147 size_t 00148 pelib_cfifo_popfifo(CFIFO_T)(cfifo_t(CFIFO_T)*, cfifo_t(CFIFO_T)* dest, size_t n); 00149 00151 size_t 00152 pelib_cfifo_length(CFIFO_T)(cfifo_t(CFIFO_T)*); 00153 00155 CFIFO_T 00156 pelib_cfifo_last(CFIFO_T)(cfifo_t(CFIFO_T)*); 00157 00159 size_t 00160 pelib_cfifo_capacity(CFIFO_T)(cfifo_t(CFIFO_T)*); 00161 #endif 00162 #undef CFIFO_T