+bool irc::irc_char_traits::lt(char c1st, char c2nd)
+{
+ return lowermap[(unsigned char)c1st] < lowermap[(unsigned char)c2nd];
+}
+
+int irc::irc_char_traits::compare(const char* str1, const char* str2, size_t n)
+{
+ for(unsigned int i = 0; i < n; i++)
+ {
+ if(lowermap[(unsigned char)*str1] > lowermap[(unsigned char)*str2])
+ return 1;
+
+ if(lowermap[(unsigned char)*str1] < lowermap[(unsigned char)*str2])
+ return -1;
+
+ if(*str1 == 0 || *str2 == 0)
+ return 0;
+
+ str1++;
+ str2++;
+ }
+ return 0;
+}
+
+std::string operator+ (std::string& leftval, irc::string& rightval)
+{
+ return leftval + std::string(rightval.c_str());
+}
+
+irc::string operator+ (irc::string& leftval, std::string& rightval)
+{
+ return leftval + irc::string(rightval.c_str());
+}
+
+bool operator== (std::string& leftval, irc::string& rightval)
+{
+ return (leftval == std::string(rightval.c_str()));
+}
+
+bool operator== (irc::string& leftval, std::string& rightval)
+{
+ return (rightval == std::string(leftval.c_str()));
+}
+
+const char* irc::irc_char_traits::find(const char* s1, int n, char c)
+{
+ while(n-- > 0 && lowermap[(unsigned char)*s1] != lowermap[(unsigned char)c])
+ s1++;
+ return s1;
+}
+
+/* See hashcomp.h if you care about these... */
+std::ostream& operator<<(std::ostream &os, const irc::string &str)
+{
+ return os << str.c_str();
+}
+
+std::istream& operator>>(std::istream &is, irc::string &str)
+{
+ std::string tmp;
+ is >> tmp;
+ str = tmp.c_str();
+ return is;
+}