initial commit
[pfinal.git] / Routix / include / sys / bitmap.h
blob67508bbc4062d8d23b689f4b0c204334c8a65bf8
1 //! Definicion de tipos
3 #ifndef __BITMAP
4 #define __BITMAP
6 /** \brief Crea un mapa de bits con tamaño para "bits" cantidad de bits
7 * \param name nombre del mapa de bits
8 * \param bits cantidad de bits que poseerá el mapa
9 */
10 #define BITMAP(name,bits) unsigned long name[(bits/(sizeof(unsigned long)*8))+1]
12 /** \brief Inicializa a 0 el mapa de bits (es mandatorio ejecutar esta función antes de utilizarlo)
13 * \param name nombre del mapa de bits
14 * \param bits cantidad de bits que poseerá el mapa
16 #define BITMAP_INIT(name,bits) memset(&name[0], 0, (bits/(sizeof(unsigned long)*8))+1)
18 /** \brief obtiene el valor de un bit
19 * \param name nombre del mapa de bits
20 * \param bit numero de bit que desea obtenerse
22 #define BITMAP_GET_BIT(name,bit) (((name[bit/sizeof(unsigned long)]) >> (bit%sizeof(long))) & 1)
24 /** \brief setea el valor de un bit dentro del mapa de bits
25 * \param name nombre del mapa de bits
26 * \param bit numero de bit que desea asignarse
27 * \param value valor que desea asignarse al bit
29 #define BITMAP_SET_BIT(name,bit,value) { \
30 unsigned long __aux = 1; \
31 __aux = __aux << (bit%sizeof(long)); \
32 if (value==0) { \
33 __aux = ~ __aux; \
34 name[bit/sizeof(unsigned long)] &= __aux; \
35 } \
36 else { \
37 name[bit/sizeof(unsigned long)] |= __aux; \
38 } \
43 /*! \brief devuelve el primer bit disponible del bitmap que concuerde con el valor value
44 * \param name nombre del bitmap
45 * \param bits tamaño del bitmap
46 * \param value valor del cuál se busca concidencia
47 * \return número de bit disponible en caso de éxito o -1 si todos están utilizados
49 static inline int BITMAP_GET_FIRST_AVAILABLE(unsigned long *name,long bits,int value) {
50 int _i;
51 for (_i = 0 ; _i<bits ; _i++) {
52 if ( BITMAP_GET_BIT(name, _i)==value )
53 return _i;
55 return -1;
59 #endif //__BITMAP