~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
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.
9
 *
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.
14
 *
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
18
 */
19
1 by brian
clean slate
20
#ifndef _SQL_BITMAP_H_
21
#define _SQL_BITMAP_H_
22
23
/*
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
27
*/
28
492.1.7 by Monty Taylor
Moved test() to its own file.
29
/// TODO: OMG FIX THIS
30
212.5.18 by Monty Taylor
Moved m_ctype, m_string and my_bitmap. Removed t_ctype.
31
#include <mysys/my_bitmap.h>
492.1.7 by Monty Taylor
Moved test() to its own file.
32
#include <drizzled/util/test.h>
1 by brian
clean slate
33
482 by Brian Aker
Remove uint.
34
template <uint32_t default_width> class Bitmap
1 by brian
clean slate
35
{
36
  MY_BITMAP map;
205 by Brian Aker
uint32 -> uin32_t
37
  uint32_t buffer[(default_width+31)/32];
1 by brian
clean slate
38
public:
511.1.4 by Monty Taylor
Merged in code for extra warnings.
39
  Bitmap() : map() { init(); }
40
  Bitmap(const Bitmap& from) : map() { *this=from; }
509.2.4 by Monty Taylor
Added init of map to Bitmap<> constructors init lists.
41
  explicit Bitmap(uint32_t prefix_to_set) : map(0) { init(prefix_to_set); }
1 by brian
clean slate
42
  void init() { bitmap_init(&map, buffer, default_width, 0); }
482 by Brian Aker
Remove uint.
43
  void init(uint32_t prefix_to_set) { init(); set_prefix(prefix_to_set); }
44
  uint32_t length() const { return default_width; }
1 by brian
clean slate
45
  Bitmap& operator=(const Bitmap& map2)
46
  {
47
    init();
48
    memcpy(buffer, map2.buffer, sizeof(buffer));
49
    return *this;
50
  }
482 by Brian Aker
Remove uint.
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); }
1 by brian
clean slate
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); }
151 by Brian Aker
Ulonglong to uint64_t
57
  void intersect(uint64_t map2buff)
1 by brian
clean slate
58
  {
59
    MY_BITMAP map2;
205 by Brian Aker
uint32 -> uin32_t
60
    bitmap_init(&map2, (uint32_t *)&map2buff, sizeof(uint64_t)*8, 0);
1 by brian
clean slate
61
    bitmap_intersect(&map, &map2);
62
  }
151 by Brian Aker
Ulonglong to uint64_t
63
  /* Use highest bit for all bits above sizeof(uint64_t)*8. */
64
  void intersect_extended(uint64_t map2buff)
1 by brian
clean slate
65
  {
66
    intersect(map2buff);
59 by Brian Aker
Removed preload from parser.
67
    if (map.n_bits > sizeof(uint64_t) * 8)
68
      bitmap_set_above(&map, sizeof(uint64_t),
53.2.31 by Monty Taylor
Removed HAVE_LONG_LONG, as this is now assumed.
69
                       test(map2buff & (1 << (sizeof(uint64_t) * 8 - 1))));
1 by brian
clean slate
70
  }
71
  void subtract(Bitmap& map2) { bitmap_subtract(&map, &map2.map); }
72
  void merge(Bitmap& map2) { bitmap_union(&map, &map2.map); }
482 by Brian Aker
Remove uint.
73
  bool is_set(uint32_t n) const { return bitmap_is_set(&map, n); }
196 by Brian Aker
Converted bitmap to use bool over my_bool
74
  bool is_set() const { return !bitmap_is_clear_all(&map); }
482 by Brian Aker
Remove uint.
75
  bool is_prefix(uint32_t n) const { return bitmap_is_prefix(&map, n); }
196 by Brian Aker
Converted bitmap to use bool over my_bool
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); }
482 by Brian Aker
Remove uint.
82
  Bitmap operator&=(uint32_t n)
1 by brian
clean slate
83
  {
84
    if (bitmap_is_set(&map, n))
85
    {
86
      bitmap_clear_all(&map);
87
      bitmap_set_bit(&map, n);
88
    }
89
    else
90
      bitmap_clear_all(&map);
91
    return *this;
92
  }
93
  Bitmap operator&=(const Bitmap& map2)
94
  {
95
    bitmap_intersect(&map, &map2.map);
96
    return *this;
97
  }
482 by Brian Aker
Remove uint.
98
  Bitmap operator&(uint32_t n)
1 by brian
clean slate
99
  {
100
    Bitmap bm(*this);
101
    bm&= n;
102
    return bm;
103
  }
104
  Bitmap operator&(const Bitmap& map2)
105
  {
106
    Bitmap bm(*this);
107
    bm&= map2;
108
    return bm;
109
  }
482 by Brian Aker
Remove uint.
110
  Bitmap operator|=(uint32_t n)
1 by brian
clean slate
111
  {
112
    bitmap_set_bit(&map, n);
113
    return *this;
114
  }
115
  Bitmap operator|=(const Bitmap& map2)
116
  {
117
    bitmap_union(&map, &map2.map);
118
  }
482 by Brian Aker
Remove uint.
119
  Bitmap operator|(uint32_t n)
1 by brian
clean slate
120
  {
121
    Bitmap bm(*this);
122
    bm|= n;
123
    return bm;
124
  }
125
  Bitmap operator|(const Bitmap& map2)
126
  {
127
    Bitmap bm(*this);
128
    bm|= map2;
129
    return bm;
130
  }
131
  Bitmap operator~()
132
  {
133
    Bitmap bm(*this);
134
    bitmap_invert(&bm.map);
135
    return bm;
136
  }
137
  char *print(char *buf) const
138
  {
139
    char *s=buf;
481 by Brian Aker
Remove all of uchar.
140
    const unsigned char *e=(unsigned char *)buffer, *b=e+sizeof(buffer)-1;
1 by brian
clean slate
141
    while (!*b && b>e)
142
      b--;
143
    if ((*s=_dig_vec_upper[*b >> 4]) != '0')
144
        s++;
145
    *s++=_dig_vec_upper[*b & 15];
146
    while (--b>=e)
147
    {
148
      *s++=_dig_vec_upper[*b >> 4];
149
      *s++=_dig_vec_upper[*b & 15];
150
    }
151
    *s=0;
152
    return buf;
153
  }
151 by Brian Aker
Ulonglong to uint64_t
154
  uint64_t to_uint64_t() const
1 by brian
clean slate
155
  {
156
    if (sizeof(buffer) >= 8)
157
      return uint8korr(buffer);
51.1.49 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
158
    assert(sizeof(buffer) >= 4);
151 by Brian Aker
Ulonglong to uint64_t
159
    return (uint64_t) uint4korr(buffer);
1 by brian
clean slate
160
  }
161
};
162
163
template <> class Bitmap<64>
164
{
151 by Brian Aker
Ulonglong to uint64_t
165
  uint64_t map;
1 by brian
clean slate
166
public:
509.2.4 by Monty Taylor
Added init of map to Bitmap<> constructors init lists.
167
  Bitmap<64>() : map(0) { }
168
  explicit Bitmap<64>(uint32_t prefix_to_set) : map(0) { set_prefix(prefix_to_set); }
1 by brian
clean slate
169
  void init() { }
482 by Brian Aker
Remove uint.
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)
1 by brian
clean slate
175
  {
176
    if (n >= length())
177
      set_all();
178
    else
151 by Brian Aker
Ulonglong to uint64_t
179
      map= (((uint64_t)1) << n)-1;
1 by brian
clean slate
180
  }
151 by Brian Aker
Ulonglong to uint64_t
181
  void set_all() { map=~(uint64_t)0; }
182
  void clear_all() { map=(uint64_t)0; }
1 by brian
clean slate
183
  void intersect(Bitmap<64>& map2) { map&= map2.map; }
151 by Brian Aker
Ulonglong to uint64_t
184
  void intersect(uint64_t map2) { map&= map2; }
185
  void intersect_extended(uint64_t map2) { map&= map2; }
1 by brian
clean slate
186
  void subtract(Bitmap<64>& map2) { map&= ~map2.map; }
187
  void merge(Bitmap<64>& map2) { map|= map2.map; }
482 by Brian Aker
Remove uint.
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; }
196 by Brian Aker
Converted bitmap to use bool over my_bool
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; }
152 by Brian Aker
longlong replacement
195
  char *print(char *buf) const { int64_t2str(map,buf,16); return buf; }
151 by Brian Aker
Ulonglong to uint64_t
196
  uint64_t to_uint64_t() const { return map; }
1 by brian
clean slate
197
};
198
199
553.1.2 by Monty Taylor
Moved some bitmap defines into bitmap.
200
typedef uint64_t table_map;          /* Used for table bits in join */
201
#if MAX_INDEXES <= 64
202
typedef Bitmap<64>  key_map;          /* Used for finding keys */
203
#else
204
typedef Bitmap<((MAX_INDEXES+7)/8*8)> key_map; /* Used for finding keys */
205
#endif
206
typedef uint32_t nesting_map;  /* Used for flags of nesting constructs */
207
208
/*
209
  Used to identify NESTED_JOIN structures within a join (applicable only to
210
  structures that have not been simplified away and embed more the one
211
  element)
212
*/
213
typedef uint64_t nested_join_map; /* Needed by sql_select.h and table.h */
214
215
/* useful constants */#
216
extern const key_map key_map_empty;
217
extern key_map key_map_full;          /* Should be threaded as const */
218
1 by brian
clean slate
219
#endif /* _SQL_BITMAP_H_ */