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@0:b3a2e39a13ad, 2012-11-28 (annotated)
- 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?
| User | Revision | Line number | New 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 |