1*f491972cSAugustin Cavalier /*
2*f491972cSAugustin Cavalier * Copyright (c) 2007-2011, Novell Inc.
3*f491972cSAugustin Cavalier *
4*f491972cSAugustin Cavalier * This program is licensed under the BSD license, read LICENSE.BSD
5*f491972cSAugustin Cavalier * for further information
6*f491972cSAugustin Cavalier */
7*f491972cSAugustin Cavalier
8*f491972cSAugustin Cavalier /*
9*f491972cSAugustin Cavalier * bitmap.h
10*f491972cSAugustin Cavalier *
11*f491972cSAugustin Cavalier */
12*f491972cSAugustin Cavalier
13*f491972cSAugustin Cavalier #ifndef LIBSOLV_BITMAP_H
14*f491972cSAugustin Cavalier #define LIBSOLV_BITMAP_H
15*f491972cSAugustin Cavalier
16*f491972cSAugustin Cavalier #include <string.h>
17*f491972cSAugustin Cavalier
18*f491972cSAugustin Cavalier #ifdef __cplusplus
19*f491972cSAugustin Cavalier extern "C" {
20*f491972cSAugustin Cavalier #endif
21*f491972cSAugustin Cavalier
22*f491972cSAugustin Cavalier typedef struct _Map {
23*f491972cSAugustin Cavalier unsigned char *map;
24*f491972cSAugustin Cavalier int size;
25*f491972cSAugustin Cavalier } Map;
26*f491972cSAugustin Cavalier
27*f491972cSAugustin Cavalier #define MAPZERO(m) (memset((m)->map, 0, (m)->size))
28*f491972cSAugustin Cavalier /* set all bits */
29*f491972cSAugustin Cavalier #define MAPSETALL(m) (memset((m)->map, 0xff, (m)->size))
30*f491972cSAugustin Cavalier /* set bit */
31*f491972cSAugustin Cavalier #define MAPSET(m, n) ((m)->map[(n) >> 3] |= 1 << ((n) & 7))
32*f491972cSAugustin Cavalier /* clear bit */
33*f491972cSAugustin Cavalier #define MAPCLR(m, n) ((m)->map[(n) >> 3] &= ~(1 << ((n) & 7)))
34*f491972cSAugustin Cavalier /* test bit */
35*f491972cSAugustin Cavalier #define MAPTST(m, n) ((m)->map[(n) >> 3] & (1 << ((n) & 7)))
36*f491972cSAugustin Cavalier
37*f491972cSAugustin Cavalier extern void map_init(Map *m, int n);
38*f491972cSAugustin Cavalier extern void map_init_clone(Map *t, Map *s);
39*f491972cSAugustin Cavalier extern void map_grow(Map *m, int n);
40*f491972cSAugustin Cavalier extern void map_free(Map *m);
41*f491972cSAugustin Cavalier extern void map_and(Map *t, Map *s);
42*f491972cSAugustin Cavalier extern void map_or(Map *t, Map *s);
43*f491972cSAugustin Cavalier extern void map_subtract(Map *t, Map *s);
44*f491972cSAugustin Cavalier
map_empty(Map * m)45*f491972cSAugustin Cavalier static inline void map_empty(Map *m)
46*f491972cSAugustin Cavalier {
47*f491972cSAugustin Cavalier MAPZERO(m);
48*f491972cSAugustin Cavalier }
map_set(Map * m,int n)49*f491972cSAugustin Cavalier static inline void map_set(Map *m, int n)
50*f491972cSAugustin Cavalier {
51*f491972cSAugustin Cavalier MAPSET(m, n);
52*f491972cSAugustin Cavalier }
map_setall(Map * m)53*f491972cSAugustin Cavalier static inline void map_setall(Map *m)
54*f491972cSAugustin Cavalier {
55*f491972cSAugustin Cavalier MAPSETALL(m);
56*f491972cSAugustin Cavalier }
map_clr(Map * m,int n)57*f491972cSAugustin Cavalier static inline void map_clr(Map *m, int n)
58*f491972cSAugustin Cavalier {
59*f491972cSAugustin Cavalier MAPCLR(m, n);
60*f491972cSAugustin Cavalier }
map_tst(Map * m,int n)61*f491972cSAugustin Cavalier static inline int map_tst(Map *m, int n)
62*f491972cSAugustin Cavalier {
63*f491972cSAugustin Cavalier return MAPTST(m, n);
64*f491972cSAugustin Cavalier }
65*f491972cSAugustin Cavalier
66*f491972cSAugustin Cavalier #ifdef __cplusplus
67*f491972cSAugustin Cavalier }
68*f491972cSAugustin Cavalier #endif
69*f491972cSAugustin Cavalier
70*f491972cSAugustin Cavalier #endif /* LIBSOLV_BITMAP_H */
71