]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Reduce size of max number of bytes in a bitfield from a 4 or 8 byte field to a 1...
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 18 Nov 2006 00:32:35 +0000 (00:32 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 18 Nov 2006 00:32:35 +0000 (00:32 +0000)
This still allows storage of 8*255 bits, which is MORE than enough (for the interested, its 2040 bits)

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5761 e03df62e-2008-0410-955e-edbf42e46eb7

include/hashcomp.h
src/hashcomp.cpp

index bf1996fac5734c946868574396071ce4d817ebb9..805929f5d1530992f0cf737ad86c0c87555f0b49 100644 (file)
@@ -397,7 +397,7 @@ namespace irc
                 * Both freebits and bits will ALWAYS be the
                 * same length.
                 */
-               size_t bits_size;
+               unsigned char bits_size;
         public:
                /** Allocate the initial memory for bits and
                 * freebits and zero the memory.
@@ -446,7 +446,7 @@ namespace irc
                 * as there are an equal number of bytes allocated
                 * for the freebits array.
                 */
-               size_t GetSize();
+               unsigned char GetSize();
        };
 
        /** The irc_char_traits class is used for RFC-style comparison of strings.
index 4c62390dd4221e65a483e7f767370f0c48db86e7..d44ab54c2d39278115126f2900daaa7a5d302eaf 100644 (file)
@@ -499,7 +499,7 @@ 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++)
+       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
@@ -515,7 +515,12 @@ irc::bitfield irc::dynamicbitmask::Allocate()
                }
        }
        /* 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];
@@ -591,7 +596,7 @@ bool irc::dynamicbitmask::Get(irc::bitfield &pos)
                throw ModuleException("irc::dynamicbitmask::Get(): Invalid bitfield, out of range");
 }
 
-size_t irc::dynamicbitmask::GetSize()
+unsigned char irc::dynamicbitmask::GetSize()
 {
        return bits_size;
 }