}
}
-irc::dynamicbitmask::dynamicbitmask()
+irc::dynamicbitmask::dynamicbitmask() : bits_size(4)
{
/* We start with 4 bytes allocated which is room
* for 4 items. Something makes me doubt its worth
* allocating less than 4 bytes.
*/
- bits_size = 4;
bits = new unsigned char[bits_size];
- freebits = new unsigned char[bits_size];
memset(bits, 0, bits_size);
- memset(freebits, 0, bits_size);
}
irc::dynamicbitmask::~dynamicbitmask()
{
/* Tidy up the entire used memory on delete */
delete[] bits;
- delete[] freebits;
}
irc::bitfield irc::dynamicbitmask::Allocate()
* should only be allocating bitfields on load, the Toggle and
* Get methods are O(1) as these are called much more often.
*/
- for (size_t i = 0; i < bits_size; i++)
+ unsigned char* freebits = this->GetFreeBits();
+ for (unsigned char i = 0; i < bits_size; i++)
{
/* Yes, this is right. You'll notice we terminate the loop when !current_pos,
* this is because we logic shift our bit off the end of unsigned char, and its
}
}
/* We dont have any free space left, increase by one */
- int old_bits_size = bits_size;
+
+ if (bits_size == 255)
+ /* Oh dear, cant grow it any further */
+ throw std::bad_alloc();
+
+ unsigned char old_bits_size = bits_size;
bits_size++;
/* Allocate new bitfield space */
unsigned char* temp_bits = new unsigned char[bits_size];
*/
bits = temp_bits;
freebits = temp_freebits;
+ this->SetFreeBits(freebits);
/* Initialize the new byte on the end of
* the bitfields, pre-allocate the one bit
* for this allocation
*/
if (pos.first < bits_size)
{
- freebits[pos.first] &= ~pos.second;
+ this->GetFreeBits()[pos.first] &= ~pos.second;
return true;
}
/* They gave a bitfield outside of the
throw ModuleException("irc::dynamicbitmask::Get(): Invalid bitfield, out of range");
}
-size_t irc::dynamicbitmask::GetSize()
+unsigned char irc::dynamicbitmask::GetSize()
{
return bits_size;
}