* find_i function for case insensitive searching

* card::contains uses case insensitive find
* Added card::contains_words for quick search, which searches for each word separately

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1484 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2010-08-04 22:33:20 +00:00
parent be922940a2
commit 50a26e4c76
5 changed files with 29 additions and 2 deletions
+15 -1
View File
@@ -57,10 +57,24 @@ String Card::identification() const {
bool Card::contains(String const& query) const {
FOR_EACH_CONST(v, data) {
if (v->toString().find(query) != String::npos) return true;
if (find_i(v->toString(),query) != String::npos) return true;
}
return false;
}
bool Card::contains_words(String const& query) const {
// iterate over the words
for (size_t i = 0 ; i < query.size() ; ) {
size_t end = query.find_first_of(_(" "),i);
if (end == i) {
i++;
} else {
end = min(end,query.size());
if (!contains(query.substr(i,end-i))) return false;
i = end;
}
}
return true;
}
IndexMap<FieldP, ValueP>& Card::extraDataFor(const StyleSheet& stylesheet) {
return extra_data.get(stylesheet.name(), stylesheet.extra_card_fields);
+2
View File
@@ -63,6 +63,8 @@ class Card : public IntrusivePtrVirtualBase {
String identification() const;
/// Does any field contains the given query string?
bool contains(String const& query) const;
/// Does this card contain each of the words in the query string?
bool contains_words(String const& query) const;
/// Find a value in the data by name and type
template <typename T> T& value(const String& name) {
+1 -1
View File
@@ -45,6 +45,6 @@ void CardListFilter::getItems(const vector<CardP>& cards, vector<VoidP>& out) co
}
bool QueryCardListFilter::keep(const CardP& card) const {
return card->contains(query);
return card->contains_words(query);
}
+8
View File
@@ -413,6 +413,14 @@ bool cannocial_name_compare(const String& as, const Char* b) {
}
}
size_t find_i(const String& heystack, const String& needle) {
if (needle.empty()) return 0;
for (size_t i = 0 ; i + needle.size() <= heystack.size() ; ++i) {
if (is_substr_i(heystack, i, needle)) return true;
}
return String::npos;
}
// ----------------------------------------------------------------------------- : Regular expressions
/// Escape a single character for use in regular expressions
+3
View File
@@ -199,6 +199,9 @@ bool is_substr_i(const String& str, size_t pos, const Char* cmp);
/// Return whether str contains the string cmp at position pos, case insensitive compare
bool is_substr_i(const String& str, size_t pos, const String& cmp);
/// Case insensitive string search, returns String::npos if not found
size_t find_i(const String& heystack, const String& needle);
/// Compare two strings for equality, b may contain '_' where a contains ' '
bool cannocial_name_compare(const String& a, const Char* b);