1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#include "clAnagram.h"
#include <algorithm>
#include <wx/wxcrt.h>
#define IS_WHITESPACE(ch) (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r')
clAnagram::clAnagram(const wxString& needle, size_t flags)
: m_flags(flags)
{
Reset(needle, m_flags);
}
clAnagram::~clAnagram() {}
bool clAnagram::Matches(const wxString& haystack) const
{
std::unordered_map<wxChar, int> charsCount = m_charCounts;
for(size_t i = 0; i < haystack.size(); ++i) {
wxChar ch = haystack[i];
ch = wxTolower(ch);
if(charsCount.count(ch)) {
int& counter = charsCount[ch];
counter--;
if(counter == 0) { charsCount.erase(ch); }
if(charsCount.empty()) { return true; }
}
}
return false;
}
bool clAnagram::MatchesInOrder(const wxString& haystack) const
{
if(m_needle.IsEmpty()) { return true; }
size_t index = 0;
size_t maxIndex = m_needle.size();
for(size_t i = 0; i < haystack.size(); ++i) {
wxChar ch = haystack[i];
ch = wxTolower(ch);
if(ch == m_needle[index]) { ++index; }
if(maxIndex == index) { return true; }
}
return false;
}
void clAnagram::Reset(const wxString& needle, size_t flags)
{
m_flags = flags;
m_needle.Clear();
if(HasFlag(eAnagramFlag::kIgnoreWhitespace)) {
for(size_t i = 0; i < needle.size(); ++i) {
wxChar ch = needle[i];
if(IS_WHITESPACE(ch)) { continue; }
m_needle.Append(wxTolower(ch));
}
} else {
m_needle = needle.Lower();
}
m_charCounts.clear();
std::for_each(m_needle.begin(), m_needle.end(), [&](wxChar ch) {
if(m_charCounts.count(ch) == 0) {
m_charCounts[ch] = 1;
} else {
m_charCounts[ch]++;
}
});
}
bool clAnagram::IsEmpty() const { return m_needle.IsEmpty(); }
|