Grelet Jacques / statis

Dependents:   Ni-MH_V3

Committer:
greletj
Date:
Wed Nov 28 18:52:43 2012 +0000
Revision:
0:b3a2e39a13ad
Child:
1:a4c87bc5b008
new statisic library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
greletj 0:b3a2e39a13ad 1 /*****************************************************************************
greletj 0:b3a2e39a13ad 2 * *
greletj 0:b3a2e39a13ad 3 * ring.cpp : Module template de gestion de buffers circulaires tous types *
greletj 0:b3a2e39a13ad 4 * *
greletj 0:b3a2e39a13ad 5 * Jacques Grelet Mars 1992 *
greletj 0:b3a2e39a13ad 6 * Bruno Buisson Aout 92 *
greletj 0:b3a2e39a13ad 7 * - Modif lecture buffer : si plein, on perd la plus *
greletj 0:b3a2e39a13ad 8 * ancienne valeur, pas toutes *
greletj 0:b3a2e39a13ad 9 * - Nouvelles fonctions : vide_ring_x() vide le buffer *
greletj 0:b3a2e39a13ad 10 * term_ring_x() libere la mem *
greletj 0:b3a2e39a13ad 11 * pr_ring_list() (debug) *
greletj 0:b3a2e39a13ad 12 * swap_ring_x() construit list *
greletj 0:b3a2e39a13ad 13 * libre_ring_x() taille dispo *
greletj 0:b3a2e39a13ad 14 * *
greletj 0:b3a2e39a13ad 15 * Bruno Buisson Novembre 95 *
greletj 0:b3a2e39a13ad 16 * - Ajout de la fonction top_ring_x() qui retourne sans*
greletj 0:b3a2e39a13ad 17 * supprimer du ring le premier de la liste *
greletj 0:b3a2e39a13ad 18 * *
greletj 0:b3a2e39a13ad 19 * Avril 96 *
greletj 0:b3a2e39a13ad 20 * - Version template *
greletj 0:b3a2e39a13ad 21 * Modification des fonctions fct_x(r,) en r.fct() *
greletj 0:b3a2e39a13ad 22 * Suppression des fonctions init et term *
greletj 0:b3a2e39a13ad 23 * (constructeur / destructeur) *
greletj 0:b3a2e39a13ad 24 * Les fonctions ont ete renommees *
greletj 0:b3a2e39a13ad 25 * Nouvelle fonction shift( n ) : supprime n elements *
greletj 0:b3a2e39a13ad 26 * *
greletj 0:b3a2e39a13ad 27 *****************************************************************************/
greletj 0:b3a2e39a13ad 28
greletj 0:b3a2e39a13ad 29 #ifdef DEBUG
greletj 0:b3a2e39a13ad 30 #include "mbed.h"
greletj 0:b3a2e39a13ad 31 #include "debug.h"
greletj 0:b3a2e39a13ad 32 extern Serial pc;
greletj 0:b3a2e39a13ad 33
greletj 0:b3a2e39a13ad 34 #endif
greletj 0:b3a2e39a13ad 35
greletj 0:b3a2e39a13ad 36 #ifndef ring_H
greletj 0:b3a2e39a13ad 37 #define ring_H
greletj 0:b3a2e39a13ad 38
greletj 0:b3a2e39a13ad 39 #include "util.h"
greletj 0:b3a2e39a13ad 40
greletj 0:b3a2e39a13ad 41
greletj 0:b3a2e39a13ad 42 // Definition du template Ring
greletj 0:b3a2e39a13ad 43 template <class T_elem>
greletj 0:b3a2e39a13ad 44 class Ring
greletj 0:b3a2e39a13ad 45 {
greletj 0:b3a2e39a13ad 46 // Type generique
greletj 0:b3a2e39a13ad 47 #define P_ELEM T_elem *
greletj 0:b3a2e39a13ad 48
greletj 0:b3a2e39a13ad 49 // Membres;
greletj 0:b3a2e39a13ad 50 private:
greletj 0:b3a2e39a13ad 51 unsigned taille,
greletj 0:b3a2e39a13ad 52 libre;
greletj 0:b3a2e39a13ad 53 P_ELEM lecture;
greletj 0:b3a2e39a13ad 54 P_ELEM ecriture;
greletj 0:b3a2e39a13ad 55 P_ELEM tampon;
greletj 0:b3a2e39a13ad 56
greletj 0:b3a2e39a13ad 57 public:
greletj 0:b3a2e39a13ad 58 P_ELEM list;
greletj 0:b3a2e39a13ad 59
greletj 0:b3a2e39a13ad 60 // Methodes inline
greletj 0:b3a2e39a13ad 61 private:
greletj 0:b3a2e39a13ad 62 inline void incr( P_ELEM &ptr );
greletj 0:b3a2e39a13ad 63
greletj 0:b3a2e39a13ad 64 public:
greletj 0:b3a2e39a13ad 65 inline unsigned nb_libre( void );
greletj 0:b3a2e39a13ad 66
greletj 0:b3a2e39a13ad 67 // Methodes
greletj 0:b3a2e39a13ad 68 public:
greletj 0:b3a2e39a13ad 69 bool put( T_elem elem );
greletj 0:b3a2e39a13ad 70 bool get( T_elem &valeur );
greletj 0:b3a2e39a13ad 71 bool top( T_elem &valeur );
greletj 0:b3a2e39a13ad 72 unsigned shift( unsigned nb = 1 );
greletj 0:b3a2e39a13ad 73 void vide( void );
greletj 0:b3a2e39a13ad 74 unsigned store( void );
greletj 0:b3a2e39a13ad 75
greletj 0:b3a2e39a13ad 76 // Constructeurs
greletj 0:b3a2e39a13ad 77 public:
greletj 0:b3a2e39a13ad 78 Ring( unsigned size = 0 );
greletj 0:b3a2e39a13ad 79 ~Ring();
greletj 0:b3a2e39a13ad 80 };
greletj 0:b3a2e39a13ad 81
greletj 0:b3a2e39a13ad 82 /*****************************************************************************
greletj 0:b3a2e39a13ad 83 * Si le pointeur ptr depasse la taille maxi du tampon, *
greletj 0:b3a2e39a13ad 84 * il revient pointer au debut. *
greletj 0:b3a2e39a13ad 85 * inline *
greletj 0:b3a2e39a13ad 86 *****************************************************************************/
greletj 0:b3a2e39a13ad 87 template <class T_elem>
greletj 0:b3a2e39a13ad 88 void Ring<T_elem>::incr( P_ELEM &ptr )
greletj 0:b3a2e39a13ad 89 {
greletj 0:b3a2e39a13ad 90 if( ++ptr - tampon >= taille ) ptr = tampon;
greletj 0:b3a2e39a13ad 91 }
greletj 0:b3a2e39a13ad 92
greletj 0:b3a2e39a13ad 93 /*****************************************************************************
greletj 0:b3a2e39a13ad 94 * Met un element dans un Ring *
greletj 0:b3a2e39a13ad 95 * Lorsque Ring est plein, deplace egalement de pointeur de lecture et la *
greletj 0:b3a2e39a13ad 96 * valeur la plus ancienne est perdue. *
greletj 0:b3a2e39a13ad 97 *****************************************************************************/
greletj 0:b3a2e39a13ad 98 template <class T_elem>
greletj 0:b3a2e39a13ad 99 bool Ring<T_elem>::put( T_elem elem )
greletj 0:b3a2e39a13ad 100 {
greletj 0:b3a2e39a13ad 101 if( taille == 0 ) return( false );
greletj 0:b3a2e39a13ad 102 *ecriture = elem;
greletj 0:b3a2e39a13ad 103 incr( ecriture );
greletj 0:b3a2e39a13ad 104 if( libre > 0 ) libre--;
greletj 0:b3a2e39a13ad 105 else incr( lecture );
greletj 0:b3a2e39a13ad 106 return( true );
greletj 0:b3a2e39a13ad 107 }
greletj 0:b3a2e39a13ad 108
greletj 0:b3a2e39a13ad 109 /*****************************************************************************
greletj 0:b3a2e39a13ad 110 * Lit une valeur dans le Ring et la stocke dans le parametre recu *
greletj 0:b3a2e39a13ad 111 * Le pointeur de lecture est incremente par cette fonction *
greletj 0:b3a2e39a13ad 112 * Retourne FALSE si le Ring est vide *
greletj 0:b3a2e39a13ad 113 *****************************************************************************/
greletj 0:b3a2e39a13ad 114 template <class T_elem>
greletj 0:b3a2e39a13ad 115 bool Ring<T_elem>::get( T_elem &valeur )
greletj 0:b3a2e39a13ad 116 {
greletj 0:b3a2e39a13ad 117 if( libre == taille ) return( FALSE );
greletj 0:b3a2e39a13ad 118 valeur = *lecture;
greletj 0:b3a2e39a13ad 119 incr( lecture );
greletj 0:b3a2e39a13ad 120 libre++;
greletj 0:b3a2e39a13ad 121 return( TRUE );
greletj 0:b3a2e39a13ad 122 }
greletj 0:b3a2e39a13ad 123
greletj 0:b3a2e39a13ad 124 /*****************************************************************************
greletj 0:b3a2e39a13ad 125 * Lit une valeur dans le Ring et la stocke dans le parametre recu *
greletj 0:b3a2e39a13ad 126 * Le pointeur de lecture n'est pas modifié par cette fonction, cf. get() *
greletj 0:b3a2e39a13ad 127 * Retourne FALSE si le Ring est vide *
greletj 0:b3a2e39a13ad 128 *****************************************************************************/
greletj 0:b3a2e39a13ad 129 template <class T_elem>
greletj 0:b3a2e39a13ad 130 bool Ring<T_elem>::top( T_elem &valeur )
greletj 0:b3a2e39a13ad 131 {
greletj 0:b3a2e39a13ad 132 if( libre == taille ) return( FALSE );
greletj 0:b3a2e39a13ad 133 valeur = *lecture;
greletj 0:b3a2e39a13ad 134 return( TRUE );
greletj 0:b3a2e39a13ad 135 }
greletj 0:b3a2e39a13ad 136
greletj 0:b3a2e39a13ad 137 /*****************************************************************************
greletj 0:b3a2e39a13ad 138 * Supprime n elements du sommet du ring *
greletj 0:b3a2e39a13ad 139 * Retourne le nb d'elements reellement supprimes *
greletj 0:b3a2e39a13ad 140 *****************************************************************************/
greletj 0:b3a2e39a13ad 141 template <class T_elem>
greletj 0:b3a2e39a13ad 142 unsigned Ring<T_elem>::shift( unsigned nb /*=1*/ )
greletj 0:b3a2e39a13ad 143 {
greletj 0:b3a2e39a13ad 144 unsigned i;
greletj 0:b3a2e39a13ad 145 T_elem val;
greletj 0:b3a2e39a13ad 146
greletj 0:b3a2e39a13ad 147 for( i = 0; i < nb && get( val ); i++ );
greletj 0:b3a2e39a13ad 148 return( i );
greletj 0:b3a2e39a13ad 149 }
greletj 0:b3a2e39a13ad 150
greletj 0:b3a2e39a13ad 151 /*****************************************************************************
greletj 0:b3a2e39a13ad 152 * Reinitialise les pointeurs de Ring. Le Ring est vide *
greletj 0:b3a2e39a13ad 153 *****************************************************************************/
greletj 0:b3a2e39a13ad 154 template <class T_elem>
greletj 0:b3a2e39a13ad 155 void Ring<T_elem>::vide( void )
greletj 0:b3a2e39a13ad 156 {
greletj 0:b3a2e39a13ad 157 libre = taille;
greletj 0:b3a2e39a13ad 158 lecture =
greletj 0:b3a2e39a13ad 159 ecriture = tampon;
greletj 0:b3a2e39a13ad 160 }
greletj 0:b3a2e39a13ad 161
greletj 0:b3a2e39a13ad 162 /*****************************************************************************
greletj 0:b3a2e39a13ad 163 * Construction du tableau list. *
greletj 0:b3a2e39a13ad 164 * Déplace les données contenues dans le buffer circulaire de Ring vers le *
greletj 0:b3a2e39a13ad 165 * tableau list[]. Les donnéees de list[] ne seront écrasées que par un autre*
greletj 0:b3a2e39a13ad 166 * appel a cette fonction *
greletj 0:b3a2e39a13ad 167 * Retourne le nombre de valeurs transférées (0 si Ring est vide) *
greletj 0:b3a2e39a13ad 168 * Version 02/02/94 : Ring est vide apres l'appel *
greletj 0:b3a2e39a13ad 169 *****************************************************************************/
greletj 0:b3a2e39a13ad 170 template <class T_elem>
greletj 0:b3a2e39a13ad 171 unsigned Ring<T_elem>::store( void )
greletj 0:b3a2e39a13ad 172 {
greletj 0:b3a2e39a13ad 173 unsigned nb_elem = taille - libre,
greletj 0:b3a2e39a13ad 174 i;
greletj 0:b3a2e39a13ad 175
greletj 0:b3a2e39a13ad 176 //DPRINTF( ("\r\nList: ") );
greletj 0:b3a2e39a13ad 177 for( i = 0; i < nb_elem; i++ ) {
greletj 0:b3a2e39a13ad 178 list[ i ] = *lecture;
greletj 0:b3a2e39a13ad 179 //DPRINTF( ("%4.3g ", list[ i ] ));
greletj 0:b3a2e39a13ad 180 incr( lecture );
greletj 0:b3a2e39a13ad 181 }
greletj 0:b3a2e39a13ad 182 //DPRINTF( ("\r\n") );
greletj 0:b3a2e39a13ad 183 libre = taille;
greletj 0:b3a2e39a13ad 184 lecture =
greletj 0:b3a2e39a13ad 185 ecriture = tampon;
greletj 0:b3a2e39a13ad 186 return( nb_elem );
greletj 0:b3a2e39a13ad 187 }
greletj 0:b3a2e39a13ad 188
greletj 0:b3a2e39a13ad 189 /*****************************************************************************
greletj 0:b3a2e39a13ad 190 * inline *
greletj 0:b3a2e39a13ad 191 *****************************************************************************/
greletj 0:b3a2e39a13ad 192 template <class T_elem>
greletj 0:b3a2e39a13ad 193 unsigned Ring<T_elem>::nb_libre( void )
greletj 0:b3a2e39a13ad 194 {
greletj 0:b3a2e39a13ad 195 return( libre );
greletj 0:b3a2e39a13ad 196 }
greletj 0:b3a2e39a13ad 197
greletj 0:b3a2e39a13ad 198 /*****************************************************************************
greletj 0:b3a2e39a13ad 199 *****************************************************************************/
greletj 0:b3a2e39a13ad 200 template <class T_elem>
greletj 0:b3a2e39a13ad 201 Ring<T_elem>::Ring( unsigned size /*=0*/ )
greletj 0:b3a2e39a13ad 202 {
greletj 0:b3a2e39a13ad 203 lecture =
greletj 0:b3a2e39a13ad 204 ecriture =
greletj 0:b3a2e39a13ad 205 tampon = ( size == 0 ? (P_ELEM) NULL : FARALLOUE( size,T_elem ) );
greletj 0:b3a2e39a13ad 206 list = ( size == 0 ? (P_ELEM) NULL : FARALLOUE( size,T_elem ) );
greletj 0:b3a2e39a13ad 207 libre =
greletj 0:b3a2e39a13ad 208 taille = ( tampon ? size : 0 );
greletj 0:b3a2e39a13ad 209 }
greletj 0:b3a2e39a13ad 210
greletj 0:b3a2e39a13ad 211 /*****************************************************************************
greletj 0:b3a2e39a13ad 212 *****************************************************************************/
greletj 0:b3a2e39a13ad 213 template <class T_elem>
greletj 0:b3a2e39a13ad 214 Ring<T_elem>::~Ring()
greletj 0:b3a2e39a13ad 215 {
greletj 0:b3a2e39a13ad 216 FARLIBERE( tampon );
greletj 0:b3a2e39a13ad 217 FARLIBERE( list );
greletj 0:b3a2e39a13ad 218 libre =
greletj 0:b3a2e39a13ad 219 taille = 0;
greletj 0:b3a2e39a13ad 220 lecture =
greletj 0:b3a2e39a13ad 221 ecriture =
greletj 0:b3a2e39a13ad 222 tampon =
greletj 0:b3a2e39a13ad 223 list = (P_ELEM) NULL;
greletj 0:b3a2e39a13ad 224 }
greletj 0:b3a2e39a13ad 225
greletj 0:b3a2e39a13ad 226 #endif