acl  3.5.3.0
acl_bits_map.h
浏览该文件的文档.
1 #ifndef ACL_BITS_MAP_INCLUDE_H
2 #define ACL_BITS_MAP_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 
10 /**
11  * 位映射结构类型定义
12  */
13 typedef struct ACL_BITS_MASK {
14  char *data; /**< bit mask */
15  size_t data_len; /**< data byte count */
17 
18 /**
19  * Bits per byte, byte in vector, bit offset in byte, bytes perset
20  */
21 #define ACL_BITS_MASK_NBBY (8)
22 #define ACL_BITS_MASK_FD_BYTE(number, mask) \
23  (((unsigned char *) (mask)->data)[(number) / ACL_BITS_MASK_NBBY])
24 #define ACL_BITS_MASK_FD_BIT(number) (1 << ((number) % ACL_BITS_MASK_NBBY))
25 #define ACL_BITS_MASK_BYTES_NEEDED(len) \
26  (size_t) (((acl_int64) (len) + (ACL_BITS_MASK_NBBY - 1)) / ACL_BITS_MASK_NBBY)
27 #define ACL_BITS_MASK_BYTE_COUNT(mask) ((mask)->data_len)
28 
29 /* Memory management. */
30 /**
31  * 分配位映射对象空间
32  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
33  * @param nmax {size_t/unsigned int/unsigned short/unsigned char} 最大值,以此值来
34  * 计算 (mask)->data 占的内存空间大小,如:当 nmax=4294967295, 即最大整数值时,则
35  * (mask)->data_len=536870912, 即 (mask)->data 占用 536870912 Bytes; 当 nmax=65535,
36  * 即最大 unsigned short 值时,则 (mask)->data_len=8192, 即 (mask)->data 占用 8192 字节
37  */
38 #define ACL_BITS_MASK_ALLOC(mask, nmax) do { \
39  size_t _byte_len = ACL_BITS_MASK_BYTES_NEEDED(nmax); \
40  (mask)->data = (char*) acl_mymalloc(_byte_len); \
41  memset((mask)->data, 0, _byte_len); \
42  (mask)->data_len = _byte_len; \
43 } while (0)
44 
45 /**
46  * 重分配位映射对象空间
47  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
48  * @param nmax {size_t/unsigned int/unsigned short/unsigned char} 最大值,以此值来
49  * 计算 (mask)->data 占的内存空间大小,如:当 nmax=4294967295, 即最大整数值时,则
50  * (mask)->data_len=536870912, 即 (mask)->data 占用 536870912 Bytes; 当 nmax=65535,
51  * 即最大 unsigned short 值时,则 (mask)->data_len=8192, 即 (mask)->data 占用 8192 字节
52  */
53 #define ACL_BITS_MASK_REALLOC(mask, nmax) do { \
54  size_t _byte_len = ACL_BITS_MASK_BYTES_NEEDED(nmax); \
55  size_t _old_len = (mask)->data_len; \
56  (mask)->data = (char*) acl_myrealloc((mask)->data, _byte_len); \
57  memset((mask)->data + _old_len, 0, _byte_len - _old_len); \
58  (mask)->data_len = _byte_len; \
59 } while (0)
60 
61 /**
62  * 释放位映射对象的内部动态空间
63  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
64  */
65 #define ACL_BITS_MASK_FREE(mask) acl_myfree((mask)->data)
66 
67 /* Set operations, modeled after FD_ZERO/SET/ISSET/CLR. */
68 
69 /**
70  * 将位映射对象的内部动态空间清零
71  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
72  */
73 #define ACL_BITS_MASK_ZERO(mask) \
74  memset((mask)->data, 0, (mask)->data_len);
75 
76 /**
77  * 将整数映射为位存储在位映射对象的动态空间中
78  * @param number {unsigned int} 整数值
79  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
80  */
81 #define ACL_BITS_MASK_SET(number, mask) \
82  (ACL_BITS_MASK_FD_BYTE((number), (mask)) |= ACL_BITS_MASK_FD_BIT(number))
83 
84 /**
85  * 判断某个整数是否存储在位映射对象的动态空间中
86  * @param number {unsigned int} 整数值
87  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
88  * @return {int} 0: 不存在;!= 0: 存在
89  */
90 #define ACL_BITS_MASK_ISSET(number, mask) \
91  (ACL_BITS_MASK_FD_BYTE((number), (mask)) & ACL_BITS_MASK_FD_BIT(number))
92 
93 /**
94  * 将某个整数从位映射对象的动态空间中清除掉
95  * @param number {unsigned int} 整数值
96  * @param mask {ACL_BITS_MASK*) ACL_BITS_MASK 指针
97  */
98 #define ACL_BITS_MASK_CLR(number, mask) \
99  (ACL_BITS_MASK_FD_BYTE((number), (mask)) &= ~ACL_BITS_MASK_FD_BIT(number))
100 
101 #ifdef __cplusplus
102 }
103 #endif
104 
105 #endif
struct ACL_BITS_MASK ACL_BITS_MASK
size_t data_len
Definition: acl_bits_map.h:15