2 * Copyright (C) Hubertus Franke, IBM Corp. 2003
6 * Latest version, more details at http://ckrm.sf.net
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
25 int size; // maxsize in longs
26 unsigned long bits[0]; // bit vector
29 #define BITS_2_LONGS(sz) (((sz)+BITS_PER_LONG-1)/BITS_PER_LONG)
30 #define BITS_2_BYTES(sz) (((sz)+7)/8)
33 #define CHECK_VEC(vec) (vec) /* check against NULL */
35 #define CHECK_VEC(vec) (1) /* assume no problem */
38 #define CHECK_VEC_VOID(vec) do { if (!CHECK_VEC(vec)) return; } while(0)
39 #define CHECK_VEC_RC(vec, val) \
40 do { if (!CHECK_VEC(vec)) return (val); } while(0)
42 inline static void bitvector_zero(bitvector_t * bitvec)
46 CHECK_VEC_VOID(bitvec);
47 sz = BITS_2_BYTES(bitvec->size);
48 memset(bitvec->bits, 0, sz);
52 inline static unsigned long bitvector_bytes(unsigned long size)
54 return sizeof(bitvector_t) + BITS_2_BYTES(size);
57 inline static void bitvector_init(bitvector_t * bitvec, unsigned long size)
60 bitvector_zero(bitvec);
64 inline static bitvector_t *bitvector_alloc(unsigned long size)
67 (bitvector_t *) kmalloc(bitvector_bytes(size), GFP_KERNEL);
75 inline static void bitvector_free(bitvector_t * bitvec)
77 CHECK_VEC_VOID(bitvec);
82 #define def_bitvec_op(name,mod1,op,mod2) \
83 inline static int name(bitvector_t *res, bitvector_t *op1, \
86 unsigned int i, size; \
88 CHECK_VEC_RC(res, 0); \
89 CHECK_VEC_RC(op1, 0); \
90 CHECK_VEC_RC(op2, 0); \
92 if (((size != (op1)->size) || (size != (op2)->size))) { \
95 size = BITS_2_LONGS(size); \
96 for (i = 0; i < size; i++) { \
97 (res)->bits[i] = (mod1 (op1)->bits[i]) op \
98 (mod2 (op2)->bits[i]); \
103 def_bitvec_op(bitvector_or,, |,);
104 def_bitvec_op(bitvector_and,, &,);
105 def_bitvec_op(bitvector_xor,, ^,);
106 def_bitvec_op(bitvector_or_not,, |, ~);
107 def_bitvec_op(bitvector_not_or, ~, |,);
108 def_bitvec_op(bitvector_and_not,, &, ~);
109 def_bitvec_op(bitvector_not_and, ~, &,);
111 inline static void bitvector_set(int idx, bitvector_t * vec)
113 set_bit(idx, vec->bits);
117 inline static void bitvector_clear(int idx, bitvector_t * vec)
119 clear_bit(idx, vec->bits);
123 inline static int bitvector_test(int idx, bitvector_t * vec)
125 return test_bit(idx, vec->bits);
129 inline static void bitvector_print(int flag, bitvector_t * vec)
133 extern int rbcedebug;
135 if ((rbcedebug & flag) == 0) {
139 printk("v<0>-NULL\n");
142 printk("v<%d>-", sz = vec->size);
143 for (i = 0; i < sz; i++) {
144 printk("%c", test_bit(i, vec->bits) ? '1' : '0');
149 #define bitvector_print(x, y)
152 #endif // BITVECTOR_H