pelib  2.0.0
include/pelib/fifo.h
Go to the documentation of this file.
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