summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-11-18 01:03:47 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-11-18 01:03:47 +0000
commit96495c200968da4523e3883ae48030cee61d87a1 (patch)
tree60298fed6c66eb047056e437e2f298e5886d18af /include
parent77300844a4607a7ad97e0a1c0907770f22e7b4af (diff)
Fix a major whoopsie in that class i just added. It must be derived using virtual methods, because each TYPE of bitmask must have its own static allocation of flags. See the (long winded) comments.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5762 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'include')
-rw-r--r--include/hashcomp.h53
1 files changed, 46 insertions, 7 deletions
diff --git a/include/hashcomp.h b/include/hashcomp.h
index 805929f5d..6e171549d 100644
--- a/include/hashcomp.h
+++ b/include/hashcomp.h
@@ -378,6 +378,47 @@ namespace irc
* 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 userrecs, and one for
+ * chanrecs, 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;
+ * }
+ * };
*/
class dynamicbitmask : public classbase
{
@@ -387,12 +428,6 @@ namespace irc
* more than 32 entries with Allocate().
*/
unsigned char* bits;
- /** A bitmask containing 1's for allocated
- * bits and 0's for free bits. When we
- * allocate a bit using Allocate(), we OR
- * its position in here to 1.
- */
- unsigned char* freebits;
/** Current set size (size of freebits and bits).
* Both freebits and bits will ALWAYS be the
* same length.
@@ -406,7 +441,7 @@ namespace irc
/** Free the memory used by bits and freebits
*/
- ~dynamicbitmask();
+ virtual ~dynamicbitmask();
/** Allocate an irc::bitfield.
* @return An irc::bitfield which can be used
@@ -447,6 +482,10 @@ namespace irc
* for the freebits array.
*/
unsigned char GetSize();
+
+ virtual unsigned char* GetFreeBits() { return NULL; }
+
+ virtual void SetFreeBits(unsigned char* freebits) { }
};
/** The irc_char_traits class is used for RFC-style comparison of strings.