OpenMW
components/misc/stringops.hpp
Go to the documentation of this file.
00001 #ifndef MISC_STRINGOPS_H
00002 #define MISC_STRINGOPS_H
00003 
00004 #include <cctype>
00005 #include <string>
00006 #include <algorithm>
00007 
00008 namespace Misc
00009 {
00010 class StringUtils
00011 {
00012     struct ci
00013     {
00014         bool operator()(int x, int y) const {
00015             return std::tolower(x) < std::tolower(y);
00016         }
00017     };
00018 
00019 public:
00020     static bool ciLess(const std::string &x, const std::string &y) {
00021         return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), ci());
00022     }
00023 
00024     static bool ciEqual(const std::string &x, const std::string &y) {
00025         if (x.size() != y.size()) {
00026             return false;
00027         }
00028         std::string::const_iterator xit = x.begin();
00029         std::string::const_iterator yit = y.begin();
00030         for (; xit != x.end(); ++xit, ++yit) {
00031             if (std::tolower(*xit) != std::tolower(*yit)) {
00032                 return false;
00033             }
00034         }
00035         return true;
00036     }
00037 
00038     static int ciCompareLen(const std::string &x, const std::string &y, size_t len)
00039     {
00040         std::string::const_iterator xit = x.begin();
00041         std::string::const_iterator yit = y.begin();
00042         for(;xit != x.end() && yit != y.end() && len > 0;++xit,++yit,--len)
00043         {
00044             int res = *xit - *yit;
00045             if(res != 0 && std::tolower(*xit) != std::tolower(*yit))
00046                 return (res > 0) ? 1 : -1;
00047         }
00048         if(len > 0)
00049         {
00050             if(xit != x.end())
00051                 return 1;
00052             if(yit != y.end())
00053                 return -1;
00054         }
00055         return 0;
00056     }
00057 
00059     static std::string &toLower(std::string &inout) {
00060         std::transform(
00061             inout.begin(),
00062             inout.end(),
00063             inout.begin(),
00064             (int (*)(int)) std::tolower
00065         );
00066         return inout;
00067     }
00068 
00070     static std::string lowerCase(const std::string &in)
00071     {
00072         std::string out = in;
00073         return toLower(out);
00074     }
00075 };
00076 
00077 
00079 bool begins(const char* str1, const char* str2);
00080 
00082 bool ends(const char* str1, const char* str2);
00083 
00085 bool ibegins(const char* str1, const char* str2);
00086 
00088 bool iends(const char* str1, const char* str2);
00089 
00090 }
00091 
00092 #endif