Grelet Jacques / statis

Dependents:   Ni-MH_V3

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?

UserRevisionLine numberNew 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