]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/hashcomp.h
This needs some general QA-ing. Add support to new parser (introduced in 1.1) for...
[user/henk/code/inspircd.git] / include / hashcomp.h
index 805929f5d1530992f0cf737ad86c0c87555f0b49..67a41a96868d9b3ba797b2afcdb131c5b202415d 100644 (file)
@@ -2,12 +2,9 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- *                       E-mail:
- *                <brain@chatspike.net>
- *                <Craig@chatspike.net>
+ *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
  *
- * Written by Craig Edwards, Craig McLure, and others.
  * This program is free but copyrighted software; see
  *            the file COPYING for details.
  *
@@ -39,7 +36,6 @@
 using namespace std;
 using irc::sockets::insp_aton;
 using irc::sockets::insp_ntoa;
-using irc::sockets::insp_inaddr;
 
 #ifndef LOWERMAP
 #define LOWERMAP
@@ -72,17 +68,6 @@ namespace nspace
         */
        void strlower(char *n);
 
-       /** Hashing function to hash insp_inaddr structs
-        */
-        template<> struct hash<insp_inaddr>
-        {
-               /** Hash an insp_inaddr
-                * @param a An insp_inaddr to hash
-                * @return The hash value
-                */
-                size_t operator()(const insp_inaddr &a) const;
-        };
-
        /** Hashing function to hash std::string without respect to case
         */
         template<> struct hash<std::string>
@@ -112,17 +97,6 @@ namespace irc
        };
 
 
-       /** This class returns true if two insp_inaddr structs match.
-        * Checking is done by copying both into a size_t then doing a
-        * numeric comparison of the two.
-        */
-       struct InAddr_HashComp
-       {
-               /** The operator () does the actual comparison in hash_map
-                */
-               bool operator()(const insp_inaddr &s1, const insp_inaddr &s2) const;
-       };
-
        /** irc::stringjoiner joins string lists into a string, using
         * the given seperator string.
         * This class can join a vector of std::string, a deque of
@@ -211,12 +185,20 @@ namespace irc
                /** Return zero or more elements which form the
                 * mode line. This will be clamped to a max of
                 * MAXMODES+1 items (MAXMODES mode parameters and
-                * one mode sequence string).
+                * one mode sequence string), and max_line_size
+                * characters. As specified below, this function
+                * should be called in a loop until it returns zero,
+                * indicating there are no more modes to return.
                 * @param result The deque to populate. This will
                 * be cleared before it is used.
-                * @return The number of elements in the deque
-                */
-               int GetStackedLine(std::deque<std::string> &result);
+                * @param max_line_size The maximum size of the line
+                * to build, in characters, seperate to MAXMODES.
+                * @return The number of elements in the deque.
+                * The function should be called repeatedly until it
+                * returns 0, in case there are multiple lines of
+                * mode changes to be obtained.
+                */
+               int GetStackedLine(std::deque<std::string> &result, int max_line_size = 360);
        };
 
        /** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.
@@ -255,7 +237,7 @@ namespace irc
                /** Fetch the next token from the stream
                 * @return The next token is returned, or an empty string if none remain
                 */
-               const std::string GetToken();
+               bool GetToken(std::string &token);
        };
 
        /** irc::sepstream allows for splitting token seperated lists.
@@ -288,6 +270,16 @@ namespace irc
                 * @return The next token is returned, or an empty string if none remain
                 */
                virtual const std::string GetToken();
+               
+               /** Fetch the entire remaining stream, without tokenizing
+                * @return The remaining part of the stream
+                */
+               virtual const std::string GetRemaining();
+               
+               /** Returns true if the end of the stream has been reached
+                * @return True if the end of the stream has been reached, otherwise false
+                */
+               virtual bool StreamEnd();
        };
 
        /** A derived form of sepstream, which seperates on commas
@@ -378,6 +370,49 @@ 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.
+        *
+        * \code
+        * 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;
+        *      }
+        * };
+        * \endcode
         */
        class dynamicbitmask : public classbase
        {
@@ -387,12 +422,7 @@ 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;
+        protected:
                /** Current set size (size of freebits and bits).
                 * Both freebits and bits will ALWAYS be the
                 * same length.
@@ -406,7 +436,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 +477,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.
@@ -482,7 +516,7 @@ namespace irc
         */
        typedef basic_string<char, irc_char_traits, allocator<char> > string;
 
-       const char* Spacify(char* n);
+       const char* Spacify(const char* n);
 }
 
 /* Define operators for using >> and << with irc::string to an ostream on an istream. */
@@ -496,7 +530,20 @@ std::istream& operator>>(std::istream &is, irc::string &str);
  */
 std::string operator+ (std::string& leftval, irc::string& rightval);
 irc::string operator+ (irc::string& leftval, std::string& rightval);
-bool operator== (std::string& leftval, irc::string& rightval);
-bool operator== (irc::string& leftval, std::string& rightval);
+bool operator== (const std::string& leftval, const irc::string& rightval);
+bool operator== (const irc::string& leftval, const std::string& rightval);
+
+std::string assign(const irc::string &other);
+irc::string assign(const std::string &other);
+
+namespace nspace
+{
+       /** Hashing function to hash irc::string
+        */
+       template<> struct hash<irc::string>
+       {
+               size_t operator()(const irc::string &s) const;
+       };
+}
 
 #endif