Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ring.h@1:a4c87bc5b008, 2012-11-29 (annotated)
- Committer:
- greletj
- Date:
- Thu Nov 29 22:45:41 2012 +0000
- Revision:
- 1:a4c87bc5b008
- Parent:
- 0:b3a2e39a13ad
- Child:
- 3:27019c77bf90
add MIT License and date revision
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| greletj | 1:a4c87bc5b008 | 1 | /* Copyright (c) <2012> <copyright J. Grelet>, MIT License |
| greletj | 1:a4c87bc5b008 | 2 | * |
| greletj | 1:a4c87bc5b008 | 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
| greletj | 1:a4c87bc5b008 | 4 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
| greletj | 1:a4c87bc5b008 | 5 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
| greletj | 1:a4c87bc5b008 | 6 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
| greletj | 1:a4c87bc5b008 | 7 | * furnished to do so, subject to the following conditions: |
| greletj | 1:a4c87bc5b008 | 8 | * |
| greletj | 1:a4c87bc5b008 | 9 | * The above copyright notice and this permission notice shall be included in all copies or |
| greletj | 1:a4c87bc5b008 | 10 | * substantial portions of the Software. |
| greletj | 1:a4c87bc5b008 | 11 | * |
| greletj | 1:a4c87bc5b008 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
| greletj | 1:a4c87bc5b008 | 13 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| greletj | 1:a4c87bc5b008 | 14 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| greletj | 1:a4c87bc5b008 | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| greletj | 1:a4c87bc5b008 | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| greletj | 1:a4c87bc5b008 | 17 | */ |
| greletj | 1:a4c87bc5b008 | 18 | |
| greletj | 1:a4c87bc5b008 | 19 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 20 | * * |
| greletj | 0:b3a2e39a13ad | 21 | * ring.cpp : Module template de gestion de buffers circulaires tous types * |
| greletj | 0:b3a2e39a13ad | 22 | * * |
| greletj | 0:b3a2e39a13ad | 23 | * Jacques Grelet Mars 1992 * |
| greletj | 0:b3a2e39a13ad | 24 | * Bruno Buisson Aout 92 * |
| greletj | 0:b3a2e39a13ad | 25 | * - Modif lecture buffer : si plein, on perd la plus * |
| greletj | 0:b3a2e39a13ad | 26 | * ancienne valeur, pas toutes * |
| greletj | 0:b3a2e39a13ad | 27 | * - Nouvelles fonctions : vide_ring_x() vide le buffer * |
| greletj | 0:b3a2e39a13ad | 28 | * term_ring_x() libere la mem * |
| greletj | 0:b3a2e39a13ad | 29 | * pr_ring_list() (debug) * |
| greletj | 0:b3a2e39a13ad | 30 | * swap_ring_x() construit list * |
| greletj | 0:b3a2e39a13ad | 31 | * libre_ring_x() taille dispo * |
| greletj | 0:b3a2e39a13ad | 32 | * * |
| greletj | 0:b3a2e39a13ad | 33 | * Bruno Buisson Novembre 95 * |
| greletj | 0:b3a2e39a13ad | 34 | * - Ajout de la fonction top_ring_x() qui retourne sans* |
| greletj | 0:b3a2e39a13ad | 35 | * supprimer du ring le premier de la liste * |
| greletj | 0:b3a2e39a13ad | 36 | * * |
| greletj | 0:b3a2e39a13ad | 37 | * Avril 96 * |
| greletj | 0:b3a2e39a13ad | 38 | * - Version template * |
| greletj | 0:b3a2e39a13ad | 39 | * Modification des fonctions fct_x(r,) en r.fct() * |
| greletj | 0:b3a2e39a13ad | 40 | * Suppression des fonctions init et term * |
| greletj | 0:b3a2e39a13ad | 41 | * (constructeur / destructeur) * |
| greletj | 0:b3a2e39a13ad | 42 | * Les fonctions ont ete renommees * |
| greletj | 0:b3a2e39a13ad | 43 | * Nouvelle fonction shift( n ) : supprime n elements * |
| greletj | 0:b3a2e39a13ad | 44 | * * |
| greletj | 1:a4c87bc5b008 | 45 | * J. Grelet Novembre 2012 * |
| greletj | 1:a4c87bc5b008 | 46 | * - Adapted for mbed ARM cortex * |
| greletj | 0:b3a2e39a13ad | 47 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 48 | |
| greletj | 0:b3a2e39a13ad | 49 | #ifdef DEBUG |
| greletj | 0:b3a2e39a13ad | 50 | #include "mbed.h" |
| greletj | 0:b3a2e39a13ad | 51 | #include "debug.h" |
| greletj | 0:b3a2e39a13ad | 52 | extern Serial pc; |
| greletj | 0:b3a2e39a13ad | 53 | |
| greletj | 0:b3a2e39a13ad | 54 | #endif |
| greletj | 0:b3a2e39a13ad | 55 | |
| greletj | 0:b3a2e39a13ad | 56 | #ifndef ring_H |
| greletj | 0:b3a2e39a13ad | 57 | #define ring_H |
| greletj | 0:b3a2e39a13ad | 58 | |
| greletj | 0:b3a2e39a13ad | 59 | #include "util.h" |
| greletj | 0:b3a2e39a13ad | 60 | |
| greletj | 0:b3a2e39a13ad | 61 | |
| greletj | 0:b3a2e39a13ad | 62 | // Definition du template Ring |
| greletj | 0:b3a2e39a13ad | 63 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 64 | class Ring |
| greletj | 0:b3a2e39a13ad | 65 | { |
| greletj | 0:b3a2e39a13ad | 66 | // Type generique |
| greletj | 0:b3a2e39a13ad | 67 | #define P_ELEM T_elem * |
| greletj | 0:b3a2e39a13ad | 68 | |
| greletj | 0:b3a2e39a13ad | 69 | // Membres; |
| greletj | 0:b3a2e39a13ad | 70 | private: |
| greletj | 0:b3a2e39a13ad | 71 | unsigned taille, |
| greletj | 0:b3a2e39a13ad | 72 | libre; |
| greletj | 0:b3a2e39a13ad | 73 | P_ELEM lecture; |
| greletj | 0:b3a2e39a13ad | 74 | P_ELEM ecriture; |
| greletj | 0:b3a2e39a13ad | 75 | P_ELEM tampon; |
| greletj | 0:b3a2e39a13ad | 76 | |
| greletj | 0:b3a2e39a13ad | 77 | public: |
| greletj | 0:b3a2e39a13ad | 78 | P_ELEM list; |
| greletj | 0:b3a2e39a13ad | 79 | |
| greletj | 0:b3a2e39a13ad | 80 | // Methodes inline |
| greletj | 0:b3a2e39a13ad | 81 | private: |
| greletj | 0:b3a2e39a13ad | 82 | inline void incr( P_ELEM &ptr ); |
| greletj | 0:b3a2e39a13ad | 83 | |
| greletj | 0:b3a2e39a13ad | 84 | public: |
| greletj | 0:b3a2e39a13ad | 85 | inline unsigned nb_libre( void ); |
| greletj | 0:b3a2e39a13ad | 86 | |
| greletj | 0:b3a2e39a13ad | 87 | // Methodes |
| greletj | 0:b3a2e39a13ad | 88 | public: |
| greletj | 0:b3a2e39a13ad | 89 | bool put( T_elem elem ); |
| greletj | 0:b3a2e39a13ad | 90 | bool get( T_elem &valeur ); |
| greletj | 0:b3a2e39a13ad | 91 | bool top( T_elem &valeur ); |
| greletj | 0:b3a2e39a13ad | 92 | unsigned shift( unsigned nb = 1 ); |
| greletj | 0:b3a2e39a13ad | 93 | void vide( void ); |
| greletj | 0:b3a2e39a13ad | 94 | unsigned store( void ); |
| greletj | 0:b3a2e39a13ad | 95 | |
| greletj | 0:b3a2e39a13ad | 96 | // Constructeurs |
| greletj | 0:b3a2e39a13ad | 97 | public: |
| greletj | 0:b3a2e39a13ad | 98 | Ring( unsigned size = 0 ); |
| greletj | 0:b3a2e39a13ad | 99 | ~Ring(); |
| greletj | 0:b3a2e39a13ad | 100 | }; |
| greletj | 0:b3a2e39a13ad | 101 | |
| greletj | 0:b3a2e39a13ad | 102 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 103 | * Si le pointeur ptr depasse la taille maxi du tampon, * |
| greletj | 0:b3a2e39a13ad | 104 | * il revient pointer au debut. * |
| greletj | 0:b3a2e39a13ad | 105 | * inline * |
| greletj | 0:b3a2e39a13ad | 106 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 107 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 108 | void Ring<T_elem>::incr( P_ELEM &ptr ) |
| greletj | 0:b3a2e39a13ad | 109 | { |
| greletj | 0:b3a2e39a13ad | 110 | if( ++ptr - tampon >= taille ) ptr = tampon; |
| greletj | 0:b3a2e39a13ad | 111 | } |
| greletj | 0:b3a2e39a13ad | 112 | |
| greletj | 0:b3a2e39a13ad | 113 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 114 | * Met un element dans un Ring * |
| greletj | 0:b3a2e39a13ad | 115 | * Lorsque Ring est plein, deplace egalement de pointeur de lecture et la * |
| greletj | 0:b3a2e39a13ad | 116 | * valeur la plus ancienne est perdue. * |
| greletj | 0:b3a2e39a13ad | 117 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 118 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 119 | bool Ring<T_elem>::put( T_elem elem ) |
| greletj | 0:b3a2e39a13ad | 120 | { |
| greletj | 0:b3a2e39a13ad | 121 | if( taille == 0 ) return( false ); |
| greletj | 0:b3a2e39a13ad | 122 | *ecriture = elem; |
| greletj | 0:b3a2e39a13ad | 123 | incr( ecriture ); |
| greletj | 0:b3a2e39a13ad | 124 | if( libre > 0 ) libre--; |
| greletj | 0:b3a2e39a13ad | 125 | else incr( lecture ); |
| greletj | 0:b3a2e39a13ad | 126 | return( true ); |
| greletj | 0:b3a2e39a13ad | 127 | } |
| greletj | 0:b3a2e39a13ad | 128 | |
| greletj | 0:b3a2e39a13ad | 129 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 130 | * Lit une valeur dans le Ring et la stocke dans le parametre recu * |
| greletj | 0:b3a2e39a13ad | 131 | * Le pointeur de lecture est incremente par cette fonction * |
| greletj | 0:b3a2e39a13ad | 132 | * Retourne FALSE si le Ring est vide * |
| greletj | 0:b3a2e39a13ad | 133 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 134 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 135 | bool Ring<T_elem>::get( T_elem &valeur ) |
| greletj | 0:b3a2e39a13ad | 136 | { |
| greletj | 0:b3a2e39a13ad | 137 | if( libre == taille ) return( FALSE ); |
| greletj | 0:b3a2e39a13ad | 138 | valeur = *lecture; |
| greletj | 0:b3a2e39a13ad | 139 | incr( lecture ); |
| greletj | 0:b3a2e39a13ad | 140 | libre++; |
| greletj | 0:b3a2e39a13ad | 141 | return( TRUE ); |
| greletj | 0:b3a2e39a13ad | 142 | } |
| greletj | 0:b3a2e39a13ad | 143 | |
| greletj | 0:b3a2e39a13ad | 144 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 145 | * Lit une valeur dans le Ring et la stocke dans le parametre recu * |
| greletj | 0:b3a2e39a13ad | 146 | * Le pointeur de lecture n'est pas modifié par cette fonction, cf. get() * |
| greletj | 0:b3a2e39a13ad | 147 | * Retourne FALSE si le Ring est vide * |
| greletj | 0:b3a2e39a13ad | 148 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 149 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 150 | bool Ring<T_elem>::top( T_elem &valeur ) |
| greletj | 0:b3a2e39a13ad | 151 | { |
| greletj | 0:b3a2e39a13ad | 152 | if( libre == taille ) return( FALSE ); |
| greletj | 0:b3a2e39a13ad | 153 | valeur = *lecture; |
| greletj | 0:b3a2e39a13ad | 154 | return( TRUE ); |
| greletj | 0:b3a2e39a13ad | 155 | } |
| greletj | 0:b3a2e39a13ad | 156 | |
| greletj | 0:b3a2e39a13ad | 157 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 158 | * Supprime n elements du sommet du ring * |
| greletj | 0:b3a2e39a13ad | 159 | * Retourne le nb d'elements reellement supprimes * |
| greletj | 0:b3a2e39a13ad | 160 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 161 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 162 | unsigned Ring<T_elem>::shift( unsigned nb /*=1*/ ) |
| greletj | 0:b3a2e39a13ad | 163 | { |
| greletj | 0:b3a2e39a13ad | 164 | unsigned i; |
| greletj | 0:b3a2e39a13ad | 165 | T_elem val; |
| greletj | 0:b3a2e39a13ad | 166 | |
| greletj | 0:b3a2e39a13ad | 167 | for( i = 0; i < nb && get( val ); i++ ); |
| greletj | 0:b3a2e39a13ad | 168 | return( i ); |
| greletj | 0:b3a2e39a13ad | 169 | } |
| greletj | 0:b3a2e39a13ad | 170 | |
| greletj | 0:b3a2e39a13ad | 171 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 172 | * Reinitialise les pointeurs de Ring. Le Ring est vide * |
| greletj | 0:b3a2e39a13ad | 173 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 174 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 175 | void Ring<T_elem>::vide( void ) |
| greletj | 0:b3a2e39a13ad | 176 | { |
| greletj | 0:b3a2e39a13ad | 177 | libre = taille; |
| greletj | 0:b3a2e39a13ad | 178 | lecture = |
| greletj | 0:b3a2e39a13ad | 179 | ecriture = tampon; |
| greletj | 0:b3a2e39a13ad | 180 | } |
| greletj | 0:b3a2e39a13ad | 181 | |
| greletj | 0:b3a2e39a13ad | 182 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 183 | * Construction du tableau list. * |
| greletj | 0:b3a2e39a13ad | 184 | * Déplace les données contenues dans le buffer circulaire de Ring vers le * |
| greletj | 0:b3a2e39a13ad | 185 | * tableau list[]. Les donnéees de list[] ne seront écrasées que par un autre* |
| greletj | 0:b3a2e39a13ad | 186 | * appel a cette fonction * |
| greletj | 0:b3a2e39a13ad | 187 | * Retourne le nombre de valeurs transférées (0 si Ring est vide) * |
| greletj | 0:b3a2e39a13ad | 188 | * Version 02/02/94 : Ring est vide apres l'appel * |
| greletj | 0:b3a2e39a13ad | 189 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 190 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 191 | unsigned Ring<T_elem>::store( void ) |
| greletj | 0:b3a2e39a13ad | 192 | { |
| greletj | 0:b3a2e39a13ad | 193 | unsigned nb_elem = taille - libre, |
| greletj | 0:b3a2e39a13ad | 194 | i; |
| greletj | 0:b3a2e39a13ad | 195 | |
| greletj | 0:b3a2e39a13ad | 196 | //DPRINTF( ("\r\nList: ") ); |
| greletj | 0:b3a2e39a13ad | 197 | for( i = 0; i < nb_elem; i++ ) { |
| greletj | 0:b3a2e39a13ad | 198 | list[ i ] = *lecture; |
| greletj | 0:b3a2e39a13ad | 199 | //DPRINTF( ("%4.3g ", list[ i ] )); |
| greletj | 0:b3a2e39a13ad | 200 | incr( lecture ); |
| greletj | 0:b3a2e39a13ad | 201 | } |
| greletj | 0:b3a2e39a13ad | 202 | //DPRINTF( ("\r\n") ); |
| greletj | 0:b3a2e39a13ad | 203 | libre = taille; |
| greletj | 0:b3a2e39a13ad | 204 | lecture = |
| greletj | 0:b3a2e39a13ad | 205 | ecriture = tampon; |
| greletj | 0:b3a2e39a13ad | 206 | return( nb_elem ); |
| greletj | 0:b3a2e39a13ad | 207 | } |
| greletj | 0:b3a2e39a13ad | 208 | |
| greletj | 0:b3a2e39a13ad | 209 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 210 | * inline * |
| greletj | 0:b3a2e39a13ad | 211 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 212 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 213 | unsigned Ring<T_elem>::nb_libre( void ) |
| greletj | 0:b3a2e39a13ad | 214 | { |
| greletj | 0:b3a2e39a13ad | 215 | return( libre ); |
| greletj | 0:b3a2e39a13ad | 216 | } |
| greletj | 0:b3a2e39a13ad | 217 | |
| greletj | 0:b3a2e39a13ad | 218 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 219 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 220 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 221 | Ring<T_elem>::Ring( unsigned size /*=0*/ ) |
| greletj | 0:b3a2e39a13ad | 222 | { |
| greletj | 0:b3a2e39a13ad | 223 | lecture = |
| greletj | 0:b3a2e39a13ad | 224 | ecriture = |
| greletj | 0:b3a2e39a13ad | 225 | tampon = ( size == 0 ? (P_ELEM) NULL : FARALLOUE( size,T_elem ) ); |
| greletj | 0:b3a2e39a13ad | 226 | list = ( size == 0 ? (P_ELEM) NULL : FARALLOUE( size,T_elem ) ); |
| greletj | 0:b3a2e39a13ad | 227 | libre = |
| greletj | 0:b3a2e39a13ad | 228 | taille = ( tampon ? size : 0 ); |
| greletj | 0:b3a2e39a13ad | 229 | } |
| greletj | 0:b3a2e39a13ad | 230 | |
| greletj | 0:b3a2e39a13ad | 231 | /***************************************************************************** |
| greletj | 0:b3a2e39a13ad | 232 | *****************************************************************************/ |
| greletj | 0:b3a2e39a13ad | 233 | template <class T_elem> |
| greletj | 0:b3a2e39a13ad | 234 | Ring<T_elem>::~Ring() |
| greletj | 0:b3a2e39a13ad | 235 | { |
| greletj | 0:b3a2e39a13ad | 236 | FARLIBERE( tampon ); |
| greletj | 0:b3a2e39a13ad | 237 | FARLIBERE( list ); |
| greletj | 0:b3a2e39a13ad | 238 | libre = |
| greletj | 0:b3a2e39a13ad | 239 | taille = 0; |
| greletj | 0:b3a2e39a13ad | 240 | lecture = |
| greletj | 0:b3a2e39a13ad | 241 | ecriture = |
| greletj | 0:b3a2e39a13ad | 242 | tampon = |
| greletj | 0:b3a2e39a13ad | 243 | list = (P_ELEM) NULL; |
| greletj | 0:b3a2e39a13ad | 244 | } |
| greletj | 0:b3a2e39a13ad | 245 | |
| greletj | 0:b3a2e39a13ad | 246 | #endif |