X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=include%2Fhashcomp.h;h=67a41a96868d9b3ba797b2afcdb131c5b202415d;hb=5870145ac255da65f5bf4ff0fae4715cbb930ec9;hp=805929f5d1530992f0cf737ad86c0c87555f0b49;hpb=77300844a4607a7ad97e0a1c0907770f22e7b4af;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/hashcomp.h b/include/hashcomp.h index 805929f5d..67a41a968 100644 --- a/include/hashcomp.h +++ b/include/hashcomp.h @@ -2,12 +2,9 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * + * 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 - { - /** 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 @@ -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 &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 &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 > 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 + { + size_t operator()(const irc::string &s) const; + }; +} #endif