The InspIRCd Project
Home | Developers | Wiki | Forums | Bug Tracker | SVN | Download
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

irc::dynamicbitmask Class Reference

The irc::dynamicbitmask class is used to maintain a bitmap of boolean values, which can grow to any reasonable size no matter how many bitfields are in it. More...

#include <hashcomp.h>

Inheritance diagram for irc::dynamicbitmask:

Inheritance graph
[legend]
Collaboration diagram for irc::dynamicbitmask:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 dynamicbitmask ()
 Allocate the initial memory for bits and freebits and zero the memory.
virtual ~dynamicbitmask ()
 Free the memory used by bits and freebits.
bitfield Allocate ()
 Allocate an irc::bitfield.
bool Deallocate (bitfield &pos)
 Deallocate an irc::bitfield.
void Toggle (bitfield &pos, bool state)
 Toggle the value of a bitfield.
bool Get (bitfield &pos)
 Get the value of a bitfield.
unsigned char GetSize ()
 Return the size in bytes allocated to the bits array.
virtual unsigned char * GetFreeBits ()
 Get free bits mask.
virtual void SetFreeBits (unsigned char *freebits)
 Set free bits mask.

Protected Attributes

unsigned char bits_size
 Current set size (size of freebits and bits).

Private Attributes

unsigned char * bits
 Data bits.

Detailed Description

The irc::dynamicbitmask class is used to maintain a bitmap of boolean values, which can grow to any reasonable size no matter how many bitfields are in it.

It starts off at 32 bits in size, large enough to hold 32 boolean values, with a memory allocation of 8 bytes. If you allocate more than 32 bits, the class will grow the bitmap by 8 bytes at a time for each set of 8 bitfields you allocate with the Allocate() method.

This method is designed so that multiple modules can be allocated bit values in a bitmap dynamically, rather than having to define costs in a fixed size unsigned integer and having the possibility of collisions of values in different third party modules.

IMPORTANT NOTE:

To use this class, you must derive from it. This is because each derived instance has its own freebits array which can determine what bitfields are allocated on a TYPE BY TYPE basis, e.g. an irc::dynamicbitmask type for Users, and one for Channels, etc. You should inheret it in a very simple way as follows. The base class will resize and maintain freebits as required, you are just required to make the pointer static and specific to this class type.

 class mydbitmask : public irc::dynamicbitmask
 {
  private:

      static unsigned char* freebits;

  public:

      mydbitmask() : irc::dynamicbitmask()
      {
          freebits = new unsigned char[this->bits_size];
          memset(freebits, 0, this->bits_size);
      }

      ~mydbitmask()
      {
          delete[] freebits;
      }

      unsigned char* GetFreeBits()
      {
          return freebits;
      }

      void SetFreeBits(unsigned char* freebt)
      {
          freebits = freebt;
      }
 };

Definition at line 494 of file hashcomp.h.


Constructor & Destructor Documentation

irc::dynamicbitmask::dynamicbitmask  ) 
 

Allocate the initial memory for bits and freebits and zero the memory.

Definition at line 504 of file hashcomp.cpp.

References bits, and bits_size.

irc::dynamicbitmask::~dynamicbitmask  )  [virtual]
 

Free the memory used by bits and freebits.

Definition at line 514 of file hashcomp.cpp.

References bits.


Member Function Documentation

irc::bitfield irc::dynamicbitmask::Allocate  ) 
 

Allocate an irc::bitfield.

Returns:
An irc::bitfield which can be used with Get, Deallocate and Toggle methods.
Exceptions:
Can throw std::bad_alloc if there is no ram left to grow the bitmask.

Definition at line 520 of file hashcomp.cpp.

References bits, bits_size, GetFreeBits(), and SetFreeBits().

bool irc::dynamicbitmask::Deallocate bitfield pos  ) 
 

Deallocate an irc::bitfield.

Parameters:
An irc::bitfield to deallocate.
Returns:
True if the bitfield could be deallocated, false if it could not.

Definition at line 577 of file hashcomp.cpp.

References bits_size, and GetFreeBits().

bool irc::dynamicbitmask::Get bitfield pos  ) 
 

Get the value of a bitfield.

Parameters:
pos A bitfield to retrieve, previously allocated by dyamicbitmask::Allocate().
Returns:
The value of the bitfield.
Exceptions:
Will throw ModuleException if the bitfield you provide is outside of the range 0 >= bitfield.first < size_bits.

Definition at line 612 of file hashcomp.cpp.

References bits, and bits_size.

virtual unsigned char* irc::dynamicbitmask::GetFreeBits  )  [inline, virtual]
 

Get free bits mask.

Definition at line 560 of file hashcomp.h.

Referenced by Allocate(), and Deallocate().

unsigned char irc::dynamicbitmask::GetSize  ) 
 

Return the size in bytes allocated to the bits array.

Note that the actual allocation is twice this, as there are an equal number of bytes allocated for the freebits array.

Definition at line 625 of file hashcomp.cpp.

References bits_size.

virtual void irc::dynamicbitmask::SetFreeBits unsigned char *  freebits  )  [inline, virtual]
 

Set free bits mask.

Definition at line 564 of file hashcomp.h.

Referenced by Allocate().

void irc::dynamicbitmask::Toggle bitfield pos,
bool  state
 

Toggle the value of a bitfield.

Parameters:
pos A bitfield to allocate, previously allocated by dyamicbitmask::Allocate().
state The state to set the field to.

Definition at line 598 of file hashcomp.cpp.

References bits, and bits_size.


Member Data Documentation

unsigned char* irc::dynamicbitmask::bits [private]
 

Data bits.

We start with four of these, and we grow the bitfield as we allocate more than 32 entries with Allocate().

Definition at line 501 of file hashcomp.h.

Referenced by Allocate(), dynamicbitmask(), Get(), Toggle(), and ~dynamicbitmask().

unsigned char irc::dynamicbitmask::bits_size [protected]
 

Current set size (size of freebits and bits).

Both freebits and bits will ALWAYS be the same length.

Definition at line 507 of file hashcomp.h.

Referenced by Allocate(), Deallocate(), dynamicbitmask(), Get(), GetSize(), and Toggle().


The documentation for this class was generated from the following files: