diff options
| author | Christian Wieninger <winni@debian.(none)> | 2007-11-28 19:40:04 +0100 |
|---|---|---|
| committer | Christian Wieninger <winni@debian.(none)> | 2007-11-28 19:40:04 +0100 |
| commit | a8fbfafb9f0683fe1344a1f59ff83ee56577c934 (patch) | |
| tree | e25040c642f18a8e09431555b544fddb06ae3600 | |
| parent | 6c107f1aeb1d4ce9ab59d0cf3e8619522497a408 (diff) | |
| download | vdr-plugin-epgsearch-a8fbfafb9f0683fe1344a1f59ff83ee56577c934.tar.gz vdr-plugin-epgsearch-a8fbfafb9f0683fe1344a1f59ff83ee56577c934.tar.bz2 | |
- speedup
| -rw-r--r-- | epgsearchtools.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/epgsearchtools.h b/epgsearchtools.h index 325b25c..3ca85c4 100644 --- a/epgsearchtools.h +++ b/epgsearchtools.h @@ -151,4 +151,41 @@ public: } }; +// --- icstring ------------------------------------------ +// a case-insensitive string class + +struct ignorecase_traits : public std::char_traits<char> { + // return whether c1 and c2 are equal + static bool eq(const char& c1, const char& c2) { + return (c1==c2 || std::toupper(c1)==std::toupper(c2)); + } + // return whether c1 is less than c2 + static bool lt(const char& c1, const char& c2) { + return std::toupper(c1)<std::toupper(c2); + } + // compare up to n characters of s1 and s2 + static int compare(const char* s1, const char* s2, + std::size_t n) { + for (std::size_t i=0; i<n; ++i) { + if (!eq(s1[i],s2[i])) { + return lt(s1[i],s2[i])?-1:1; + } + } + return 0; + } + // search c in s + static const char* find(const char* s, std::size_t n, + const char& c) { + for (std::size_t i=0; i<n; ++i) { + if (eq(s[i],c)) { + return &(s[i]); + } + } + return 0; + } +}; + +// define a special type for such strings +typedef std::basic_string<char,ignorecase_traits> icstring; + #endif |
