]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/hashcomp.h
Sexeger!
[user/henk/code/inspircd.git] / include / hashcomp.h
index 445c4c4ea2319c1997b63ee4ba0baa6487c235b0..aa3504994088df4c30b1635941fafd66fd34c070 100644 (file)
@@ -58,28 +58,6 @@ unsigned const char lowermap[256] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
 };
 #endif
 
-/** Because of weirdness in g++, before 3.x this was namespace std. It's now __gnu_cxx.
- * This is a #define'd alias.
- */
-namespace nspace
-{
-       /** Convert a string to lower case respecting RFC1459
-        * @param n A string to lowercase
-        */
-       void strlower(char *n);
-
-       /** Hashing function to hash std::string without respect to case
-        */
-        template<> struct hash<std::string>
-        {
-               /** Hash a std::string using RFC1459 case sensitivity rules
-                * @param s A string to hash
-                * @return The hash value
-                */
-                size_t operator()(const string &s) const;
-        };
-}
-
 /** The irc namespace contains a number of helper classes.
  */
 namespace irc
@@ -103,7 +81,7 @@ namespace irc
         * std::string, or a const char** array, using overloaded
         * constructors.
         */
-       class stringjoiner
+       class CoreExport stringjoiner
        {
         private:
                /** Output string
@@ -142,7 +120,7 @@ namespace irc
         * It can then reproduce this list, clamped to a maximum of MAXMODES
         * values per line.
         */
-       class modestacker
+       class CoreExport modestacker
        {
         private:
                /** The mode sequence and its parameters
@@ -185,12 +163,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.
@@ -205,7 +191,7 @@ namespace irc
         * list will be ":item". This is to allow for parsing 'source' fields
         * from data.
         */
-       class tokenstream
+       class CoreExport tokenstream
        {
         private:
                /** Original string
@@ -229,7 +215,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.
@@ -237,7 +223,7 @@ namespace irc
         * the next token, until none remain, at which point the method returns
         * an empty string.
         */
-       class sepstream : public classbase
+       class CoreExport sepstream : public classbase
        {
         private:
                /** Original string
@@ -263,6 +249,11 @@ namespace irc
                 */
                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
                 */
@@ -271,7 +262,7 @@ namespace irc
 
        /** A derived form of sepstream, which seperates on commas
         */
-       class commasepstream : public sepstream
+       class CoreExport commasepstream : public sepstream
        {
         public:
                commasepstream(const std::string &source) : sepstream(source, ',')
@@ -281,7 +272,7 @@ namespace irc
 
        /** A derived form of sepstream, which seperates on spaces
         */
-       class spacesepstream : public sepstream
+       class CoreExport spacesepstream : public sepstream
        {
         public:
                spacesepstream(const std::string &source) : sepstream(source, ' ')
@@ -297,7 +288,7 @@ namespace irc
         * start or end < 0) then GetToken() will return the first element
         * of the pair of numbers.
         */
-       class portparser : public classbase
+       class CoreExport portparser : public classbase
        {
         private:
                /** Used to split on commas
@@ -401,7 +392,7 @@ namespace irc
         * };
         * \endcode
         */
-       class dynamicbitmask : public classbase
+       class CoreExport dynamicbitmask : public classbase
        {
         private:
                /** Data bits. We start with four of these,
@@ -490,47 +481,129 @@ namespace irc
 
                /** Compare two strings of size n
                 */
-               static int compare(const char* str1, const char* str2, size_t n);
+               static CoreExport int compare(const char* str1, const char* str2, size_t n);
 
                /** Find a char within a string up to position n
                 */
-               static const char* find(const char* s1, int  n, char c);
+               static CoreExport const char* find(const char* s1, int  n, char c);
        };
 
-       std::string hex(const unsigned char *raw, size_t rawsz);
+       CoreExport std::string hex(const unsigned char *raw, size_t rawsz);
 
        /** This typedef declares irc::string based upon irc_char_traits
         */
        typedef basic_string<char, irc_char_traits, allocator<char> > string;
 
-       const char* Spacify(const char* n);
+       CoreExport const char* Spacify(const char* n);
 }
 
 /* Define operators for using >> and << with irc::string to an ostream on an istream. */
 /* This was endless fun. No. Really. */
 /* It was also the first core change Ommeh made, if anyone cares */
-std::ostream& operator<<(std::ostream &os, const irc::string &str);
-std::istream& operator>>(std::istream &is, irc::string &str);
+inline std::ostream& operator<<(std::ostream &os, const irc::string &str) { return os << str.c_str(); }
+inline std::istream& operator>>(std::istream &is, irc::string &str)
+{
+       std::string tmp;
+       is >> tmp;
+       str = tmp.c_str();
+       return is;
+}
 
 /* Define operators for + and == with irc::string to std::string for easy assignment
  * and comparison - Brain
  */
-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);
+inline std::string operator+ (std::string& leftval, irc::string& rightval)
+{
+       return leftval + std::string(rightval.c_str());
+}
 
-std::string assign(const irc::string &other);
-irc::string assign(const std::string &other);
+inline irc::string operator+ (irc::string& leftval, std::string& rightval)
+{
+       return leftval + irc::string(rightval.c_str());
+}
+
+inline bool operator== (const std::string& leftval, const irc::string& rightval)
+{
+       return (leftval.c_str() == rightval);
+}
+
+inline bool operator== (const irc::string& leftval, const std::string& rightval)
+{
+       return (leftval == rightval.c_str());
+}
+
+inline std::string assign(const irc::string &other) { return other.c_str(); }
+inline irc::string assign(const std::string &other) { return other.c_str(); }
+inline std::string& trim(std::string &str)
+{
+       std::string::size_type start = str.find_first_not_of(" ");
+       std::string::size_type end = str.find_last_not_of(" ");
+       if (start == std::string::npos || end == std::string::npos)
+               str = "";
+       else
+               str = str.substr(start, end-start+1);
+
+       return str;
+}
+
+/* Hashing stuff is totally different on vc++'s hash_map implementation, so to save a buttload of #ifdefs we'll just
+   do it all at once - Burlex */
 
 namespace nspace
 {
        /** Hashing function to hash irc::string
         */
+#ifdef WINDOWS
+       template<> class CoreExport hash_compare<irc::string, std::less<irc::string> >
+       {
+       public:
+               enum { bucket_size = 4, min_buckets = 8 };                      // Got these numbers from the CRT source,
+                                                                                                                       // if anyone wants to change them feel free.
+               bool operator()(const irc::string & s1, const irc::string & s2) const
+               {
+                       if(s1.length() != s2.length()) return true;
+                       return (irc::irc_char_traits::compare(s1.c_str(), s2.c_str(), s1.length()) < 0);
+               }
+               
+               size_t operator()(const irc::string & s) const;
+       };
+
+       template<> class CoreExport hash_compare<std::string, std::less<std::string> >
+       {
+       public:
+               enum { bucket_size = 4, min_buckets = 8 };
+               bool operator()(const std::string & s1, const std::string & s2) const
+               {
+                       if(s1.length() != s2.length()) return true;
+                       return (irc::irc_char_traits::compare(s1.c_str(), s2.c_str(), s1.length()) < 0);
+               }
+               
+               /** Hash a std::string using RFC1459 case sensitivity rules
+               * @param s A string to hash
+               * @return The hash value
+               */
+               size_t operator()(const std::string & s) const;
+       };
+#else
        template<> struct hash<irc::string>
        {
                size_t operator()(const irc::string &s) const;
        };
+
+       template<> struct hash<std::string>
+       {
+               /** Hash a std::string using RFC1459 case sensitivity rules
+               * @param s A string to hash
+               * @return The hash value
+               */
+               size_t operator()(const string &s) const;
+       };
+#endif
+
+       /** Convert a string to lower case respecting RFC1459
+       * @param n A string to lowercase
+       */
+       void strlower(char *n);
 }
 
 #endif