/* * Case-insensitive string equality * * Based on "How to do case-insensitive string comparison" * By Matt Austern * http://lafstern.org/matt/col2_new.pdf */ #pragma once #include #include #include #include struct eq_str { struct eq_char { const char *tab; eq_char(const char *t) : tab(t) { } bool operator()(char x, char y) const { return this->tab[x - std::numeric_limits::min()] == this->tab[y - std::numeric_limits::min()]; } }; char tab[std::numeric_limits::max() - std::numeric_limits::min() + 1]; eq_str(const std::locale &L = std::locale::classic()) { for (int i = std::numeric_limits::min(); i <= std::numeric_limits::max(); ++i) this->tab[i - std::numeric_limits::min()] = static_cast(i); std::use_facet>(L).toupper(this->tab, this->tab + (std::numeric_limits::max() - std::numeric_limits::min() + 1)); } bool operator()(const std::string &x, const std::string &y) const { return x.length() == y.length() && std::equal(x.begin(), x.end(), y.begin(), eq_char(this->tab)); } };