1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#ifndef _SQL_BITMAP_H_
21
#define _SQL_BITMAP_H_
24
Implementation of a bitmap type.
25
The idea with this is to be able to handle any constant number of bits but
26
also be able to use 32 or 64 bits bitmaps very efficiently
29
/// TODO: OMG FIX THIS
31
#include <mysys/my_bitmap.h>
32
#include <drizzled/util/test.h>
34
template <uint32_t default_width> class Bitmap
37
uint32_t buffer[(default_width+31)/32];
40
Bitmap(const Bitmap& from) { *this=from; }
41
explicit Bitmap(uint32_t prefix_to_set) { init(prefix_to_set); }
42
void init() { bitmap_init(&map, buffer, default_width, 0); }
43
void init(uint32_t prefix_to_set) { init(); set_prefix(prefix_to_set); }
44
uint32_t length() const { return default_width; }
45
Bitmap& operator=(const Bitmap& map2)
48
memcpy(buffer, map2.buffer, sizeof(buffer));
51
void set_bit(uint32_t n) { bitmap_set_bit(&map, n); }
52
void clear_bit(uint32_t n) { bitmap_clear_bit(&map, n); }
53
void set_prefix(uint32_t n) { bitmap_set_prefix(&map, n); }
54
void set_all() { bitmap_set_all(&map); }
55
void clear_all() { bitmap_clear_all(&map); }
56
void intersect(Bitmap& map2) { bitmap_intersect(&map, &map2.map); }
57
void intersect(uint64_t map2buff)
60
bitmap_init(&map2, (uint32_t *)&map2buff, sizeof(uint64_t)*8, 0);
61
bitmap_intersect(&map, &map2);
63
/* Use highest bit for all bits above sizeof(uint64_t)*8. */
64
void intersect_extended(uint64_t map2buff)
67
if (map.n_bits > sizeof(uint64_t) * 8)
68
bitmap_set_above(&map, sizeof(uint64_t),
69
test(map2buff & (1 << (sizeof(uint64_t) * 8 - 1))));
71
void subtract(Bitmap& map2) { bitmap_subtract(&map, &map2.map); }
72
void merge(Bitmap& map2) { bitmap_union(&map, &map2.map); }
73
bool is_set(uint32_t n) const { return bitmap_is_set(&map, n); }
74
bool is_set() const { return !bitmap_is_clear_all(&map); }
75
bool is_prefix(uint32_t n) const { return bitmap_is_prefix(&map, n); }
76
bool is_clear_all() const { return bitmap_is_clear_all(&map); }
77
bool is_set_all() const { return bitmap_is_set_all(&map); }
78
bool is_subset(const Bitmap& map2) const { return bitmap_is_subset(&map, &map2.map); }
79
bool is_overlapping(const Bitmap& map2) const { return bitmap_is_overlapping(&map, &map2.map); }
80
bool operator==(const Bitmap& map2) const { return bitmap_cmp(&map, &map2.map); }
81
bool operator!=(const Bitmap& map2) const { return !bitmap_cmp(&map, &map2.map); }
82
Bitmap operator&=(uint32_t n)
84
if (bitmap_is_set(&map, n))
86
bitmap_clear_all(&map);
87
bitmap_set_bit(&map, n);
90
bitmap_clear_all(&map);
93
Bitmap operator&=(const Bitmap& map2)
95
bitmap_intersect(&map, &map2.map);
98
Bitmap operator&(uint32_t n)
104
Bitmap operator&(const Bitmap& map2)
110
Bitmap operator|=(uint32_t n)
112
bitmap_set_bit(&map, n);
115
Bitmap operator|=(const Bitmap& map2)
117
bitmap_union(&map, &map2.map);
119
Bitmap operator|(uint32_t n)
125
Bitmap operator|(const Bitmap& map2)
134
bitmap_invert(&bm.map);
137
char *print(char *buf) const
140
const unsigned char *e=(unsigned char *)buffer, *b=e+sizeof(buffer)-1;
143
if ((*s=_dig_vec_upper[*b >> 4]) != '0')
145
*s++=_dig_vec_upper[*b & 15];
148
*s++=_dig_vec_upper[*b >> 4];
149
*s++=_dig_vec_upper[*b & 15];
154
uint64_t to_uint64_t() const
156
if (sizeof(buffer) >= 8)
157
return uint8korr(buffer);
158
assert(sizeof(buffer) >= 4);
159
return (uint64_t) uint4korr(buffer);
163
template <> class Bitmap<64>
167
Bitmap<64>() { map= 0; }
168
explicit Bitmap<64>(uint32_t prefix_to_set) { set_prefix(prefix_to_set); }
170
void init(uint32_t prefix_to_set) { set_prefix(prefix_to_set); }
171
uint32_t length() const { return 64; }
172
void set_bit(uint32_t n) { map|= ((uint64_t)1) << n; }
173
void clear_bit(uint32_t n) { map&= ~(((uint64_t)1) << n); }
174
void set_prefix(uint32_t n)
179
map= (((uint64_t)1) << n)-1;
181
void set_all() { map=~(uint64_t)0; }
182
void clear_all() { map=(uint64_t)0; }
183
void intersect(Bitmap<64>& map2) { map&= map2.map; }
184
void intersect(uint64_t map2) { map&= map2; }
185
void intersect_extended(uint64_t map2) { map&= map2; }
186
void subtract(Bitmap<64>& map2) { map&= ~map2.map; }
187
void merge(Bitmap<64>& map2) { map|= map2.map; }
188
bool is_set(uint32_t n) const { return test(map & (((uint64_t)1) << n)); }
189
bool is_prefix(uint32_t n) const { return map == (((uint64_t)1) << n)-1; }
190
bool is_clear_all() const { return map == (uint64_t)0; }
191
bool is_set_all() const { return map == ~(uint64_t)0; }
192
bool is_subset(const Bitmap<64>& map2) const { return !(map & ~map2.map); }
193
bool is_overlapping(const Bitmap<64>& map2) const { return (map & map2.map)!= 0; }
194
bool operator==(const Bitmap<64>& map2) const { return map == map2.map; }
195
char *print(char *buf) const { int64_t2str(map,buf,16); return buf; }
196
uint64_t to_uint64_t() const { return map; }
200
/* An iterator to quickly walk over bits in unint64_t bitmap. */
201
class Table_map_iterator
206
Table_map_iterator(uint64_t t) : bmp(t), no(0) {}
209
static const char last_bit[16]= {32, 0, 1, 0,
214
while ((bit= last_bit[bmp & 0xF]) == 32)
224
enum { BITMAP_END= 64 };
229
void print_bits(table_map bmp)
231
Table_map_iterator it(bmp);
233
fprintf(stderr, "0x%llx = ", bmp);
234
while ((i= it.next_bit()) != Table_map_iterator::BITMAP_END)
236
fprintf(stderr, " %s 2^%d", (first?"":"+"), i);
240
fprintf(stderr, "\n");
256
#endif /* _SQL_BITMAP_H_ */