Commit dfb2d19f authored by unknown's avatar unknown

After test on Mac OS X fixes

parent e0504b7e
......@@ -29,7 +29,8 @@ void bitvector::create_last_word_mask()
* bits clear. The bits within each byte is stored in big-endian order.
*/
unsigned char const mask= (~((1 << used) - 1)) & 255;
last_word_ptr= (uint32*)(m_data+((bytes()-1U)>>2));
unsigned int byte_no= ((bytes()-1)) & ~3U;
last_word_ptr= (uint32*)&m_data[byte_no];
/*
The first bytes are to be set to zero since they represent real bits
......@@ -65,6 +66,7 @@ void bitvector::create_last_word_mask()
int bitvector::init(size_t size)
{
DBUG_ASSERT(size < MYSQL_NO_BIT_FOUND);
DBUG_ASSERT(size > 0);
m_size= size;
m_data= (uchar*)my_malloc(byte_size_word_aligned(size), MYF(0));
if (m_data)
......@@ -289,32 +291,56 @@ bool do_test(uint bitsize)
bv = new bitvector;
bv->init(bitsize);
if (test_set_get_clear_bit(bv,bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_flip_bit(bv,bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_operators(bv,bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_get_all_bits(bv, bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_compare_operators(bv,bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_count_bits_set(bv,bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_get_first_bit(bv,bitsize))
return TRUE;
goto error;
bv->clear_all();
if (test_get_next_bit(bv,bitsize))
return TRUE;
printf("OK");
goto error;
delete bv;
return FALSE;
error:
delete bv;
printf("\n");
return TRUE;
}
int main()
{
int i;
for (i= 0; i < 4096; i++)
for (i= 1; i < 4096; i++)
if (do_test(i))
return -1;
printf("OK\n");
return 0;
}
/*
Compile by using the below on a compiled clone
g++ -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../regex -I. -I../include
-g -fno-omit-frame-pointer -fno-common -felide-constructors -fno-exceptions
-fno-rtti -fno-implicit-templates -fno-exceptions -fno-rtti
-DUSE_MYSYS_NEW -DDEFINE_CXA_PURE_VIRTUAL -DHAVE_DARWIN_THREADS
-D_P1003_1B_VISIBLE -DTEST_BITVECTOR -DSIGNAL_WITH_VIO_CLOSE
-DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT -o bitvector.o
-c bitvector.cc
g++ -o bitvector bitvector.o -L../mysys -lmysys -L../dbug -L../strings
-lmystrings -ldbug
*/
#endif
......@@ -177,8 +177,8 @@ public:
bool get_all_bits_clear()
{
uint32 *data_ptr= (uint32*)&m_data[0];
if (*last_word_ptr ^ last_word_mask)
uint32 *data_ptr= (uint32*)m_data;
if (*last_word_ptr != last_word_mask)
return FALSE;
for (; data_ptr < last_word_ptr; data_ptr++)
if (*data_ptr)
......@@ -204,7 +204,8 @@ public:
/* Set a bit to a value */
void set_bit(size_t pos)
{
*(uchar*)(m_data + (pos >> 3)) |= (uchar)(1 << (pos & 0x7U));
DBUG_ASSERT(pos < m_size);
m_data[pos>>3]|= (uchar)(1 << (pos & 0x7U));
}
/* Reset (clear) all bits in the vector */
......@@ -217,18 +218,27 @@ public:
/* Reset one bit in the vector */
void clear_bit(size_t pos)
{
*(u_char*)(m_data + (pos >> 3)) &= (u_char)(~(1 << (pos & 0x7U)));
DBUG_ASSERT(pos < m_size);
m_data[pos>>3]&= ~(uchar)(1 << (pos & 0x7U));
}
void flip_bit(size_t pos)
{
*(uchar*)(m_data + (pos >> 3)) ^= (uchar)(1 << (pos & 0x7U));
DBUG_ASSERT(pos < m_size);
m_data[pos>>3]^= (uchar)(1 << (pos & 0x7U));
}
bool get_bit(size_t pos) const
{
return (bool)(*(uchar*)(m_data + (pos >> 3))) &
(uchar)(1 << (pos & 0x7U));
DBUG_ASSERT(pos < m_size);
/*
!! provides the most effective implementation of conversion to
bool
*/
uchar *byte_word= m_data + (pos >> 3);
uchar mask= 1 << (pos & 0x7U);
bool ret_value= !!(*byte_word & mask);
return ret_value;
};
bool operator==(bitvector const& rhs) const
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment