#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <optional>
#include <cassert>
#include <future>
//? ΠΡΠ±ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ»
//* ΠΠΎΠ»Ρ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
//# ΠΡΠ±Π°Ρ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½Π°Ρ ΡΠΈΡΡΠ° (0-9)
//[charlist] ΠΡΠ±ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π² charlist
//[!charlist] ΠΡΠ±ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ», ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΉ Π² charlist
//Symbol Meaning
//LIKE '5[*]' 5*
//LIKE '[?]n' ?n
//LIKE '[a-cdf]' a, b, c, d, or f
//LIKE '[-acdf]' -, a, c, d, or f
//LIKE '[ [ ]' [
//LIKE ']' ]
//LIKE 'abc[_]d*' abc_d and abc_de
//LIKE 'abc[def]' abcd, abce, and abcf
constexpr bool MatchWildcardAndText_showDebugOutput = !true;
constexpr std::wstring_view MatchWildcardAndText_DebugPrefix = L" dbg: ";
bool MatchWildcardAndText(const std::wstring_view text, const std::wstring_view wc)
{
auto wc_cur = wc.cbegin();
auto wc_end = wc.cend();
auto text_cur = text.cbegin();
auto text_end = text.cend();
//ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΠΏΠ°ΡΡΠ΅Π½Π½ΡΡ
ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ
ΡΠΊΠΎΠ±ΠΊΠ°Ρ
struct s_SquareBracketsInfo
{
private:
//#todo - Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΡΡΠΎΠΊΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ, ΡΠΎΠ³Π΄Π° ΡΠ±Π΅ΡΡΡΡΡ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΡΡΠ΅ΠΉ
std::wstring m_CharsList;//ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΡΠ°ΡΠΊΡΡΡΡΠΉ ΠΈΠ· ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ
ΡΠΊΠΎΠ±ΠΎΠΉ
size_t m_ClosingBracketPos{};//ΠΏΠΎΠ·ΠΈΡΠΈΡ Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ΅ΠΉ ΡΠΊΠΎΠ±ΠΊΠΈ
bool m_Inverted{};//ΡΠ»Π°Π³ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ ΠΈΠ· Π½Π°ΡΠ°Π»Π° ΡΠΊΠΎΠ±ΠΎΠΊ
private:
//Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ: ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ°ΡΠΏΠ°ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ΅ΠΊΡΡ.
//ΠΡΠ»ΠΈ ΠΎΠ½ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅, ΡΠΎ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΠ°ΡΡΠΈΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, Π²ΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ
std::optional<std::wstring_view> m_lastParsedText;
public:
bool TestChar(const char c)const noexcept
{
const bool contains = (m_CharsList.find(c) != m_CharsList.npos);
if (m_Inverted)
{
return !contains;
}
else
{
return contains;
}
}
bool Parse(const std::wstring_view text)
{
if (m_lastParsedText)
{
if (m_lastParsedText->size() == text.size())
{
if (m_lastParsedText->data() == text.data())
{
if constexpr (MatchWildcardAndText_showDebugOutput)std::wcout << MatchWildcardAndText_DebugPrefix << L"m_lastParsedText reused\n";
return true;
}
}
}
auto res = Parse__(text);
if (res)
{
//Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ°ΡΡΡΠ½Π½ΡΠΉ ΡΠ΅ΠΊΡΡ
m_lastParsedText = text;
//if constexpr(MatchWildcardAndText_showDebugOutput)std::wcout<<MatchWildcardAndText_DebugPrefix<<L"m_lastParsedText saved\n";
assert(m_lastParsedText);
assert(!m_lastParsedText->empty());
assert(m_lastParsedText->size() > m_ClosingBracketPos);
assert((*m_lastParsedText)[m_ClosingBracketPos] == L']');
}
else
{
//ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ ΠΌΠ΅Π½ΡΡΡΡΡ, Π·Π°Π±ΡΠ²Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ΅ΠΊΡΡ
m_lastParsedText.reset();
if constexpr (MatchWildcardAndText_showDebugOutput)std::wcout << MatchWildcardAndText_DebugPrefix << L"m_lastParsedText reset\n";
}
return res;
}
size_t PosOfClosingBracket()const noexcept
{
return m_ClosingBracketPos;
}
private:
//Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΈΠ· ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ
ΡΠΊΠΎΠ±ΠΎΠΊ
//text - Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΊΡΡΠ²Π°ΡΡΠ΅ΠΉ L'['
bool Parse__(std::wstring_view text)
{
//ΡΡΡ Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠΎΠ² [ababa].
//ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΠ·Π΅Ρ ΡΠ°ΠΌ ΡΠ΅Π±Π΅ Π½Π΅ Π²ΡΠ°Π³, Π° Π΅ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ
//ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠΎΠ² - ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°
m_CharsList.clear();
m_ClosingBracketPos = {};
m_Inverted = {};
m_CharsList.reserve(256);
if (text.empty())return false;
//ΡΠΏΡΠ°Π²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎ Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ΅ΠΉ ΡΠΊΠΎΠ±ΠΊΠ΅
{
const auto pos = text.find_first_of(L']');
if (pos == text.npos)return false;
text = text.substr(0, pos);
m_ClosingBracketPos = pos;
}
//ΡΠ»Π°Π³ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ
if (!text.empty() && text.front() == L'!')
{
m_Inverted = true;
text.remove_prefix(1);
}
//ΡΠ΅ΠΉΡΠ°Ρ text ΡΠ°ΠΊΠΎΠΉ:
//begin,front - ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠΎΡΠ»Π΅ L'[' ΠΈΠ»ΠΈ L"[!"
//back - ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Π΄ L']'
//end - L']'
auto text_cur = text.cbegin();
auto text_end = text.cend();
while (text_cur != text_end)
{
//text_cur - ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ»
//Π΅ΡΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΡΡΠΎ ΠΌΠΈΠ½ΡΡ,
if (auto hyphen = text_cur + 1; hyphen != text_end && *hyphen == L'-')
{
//ΡΠΎ ΠΏΠΎΡΠ»Π΅ ΠΌΠΈΠ½ΡΡΠ° ΡΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»
if (auto second = hyphen + 1; second != text_end)
{
//ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° X-Z, ΡΠ΅ΠΉΡΠ°Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌΡΡ Π½Π° X
char c1 = *text_cur;
char c2 = *second;
if (c1 > c2)std::swap(c1, c2);
for (char c = c1; c <= c2; ++c)m_CharsList.push_back(c);
//ΠΈΠ΄ΡΠΌ Π΄Π°Π»ΡΡΠ΅
text_cur = second + 1;
continue;
}
}
//ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» ΠΊΠ»Π°Π΄ΡΠΌ Π² ΡΠΏΠΈΡΠΎΠΊ
m_CharsList.push_back(*text_cur);
text_cur++;
}
return true;
}
};
s_SquareBracketsInfo SBInfo;
while (wc_cur != wc_end)
{
if (text_cur == text_end)
{
//Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠ΅ Π·Π²ΡΠ·Π΄ΠΎΡΠΊΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ
if (*wc_cur == L'*')
{
++wc_cur;
continue;
}
return false;
}
switch (*wc_cur)
{
default:
{
//Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» - Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°ΡΡΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ
if (*wc_cur == *text_cur)
{
++wc_cur;
++text_cur;
}
else
{
return false;
}
}break;
case L'?':
{
++wc_cur;
++text_cur;
}break;
case L'#':
{
if (L'0' <= *text_cur && *text_cur <= L'9')
{
++wc_cur;
++text_cur;
}
else
{
return false;
}
}break;
case L'*':
{
auto wc_next = wc_cur + 1;
bool done{};
do
{
if (wc_next != wc_end)
{
switch (*wc_next)
{
default:
{
//Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» - Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°ΡΡΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ
if (*wc_next == *text_cur)
{
//ΡΠΎΠ²ΠΏΠ°Π», ΠΏΠΎΡΡΠΎΠΌΡ Π·Π²ΡΠ·Π΄ΠΎΡΠΊΡ ΡΡΠΈΡΠ°Π΅ΠΌ Π·Π°Π²Π΅ΡΡΡΠ½Π½ΠΎΠΉ
++wc_cur;
done = true;
}
else
{
//Π·Π²ΡΠ·Π΄ΠΎΡΠΊΠ° Π·Π°Π±ΠΈΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈΠ· ΡΠ΅ΠΊΡΡΠ°
++text_cur;
}
}break;
case L'?':
{
//Π·Π²Π΅Π·Π΄Π° ΡΠΌΠ°ΡΡΠΈΠ»Π°ΡΡ Ρ ΠΏΡΡΡΠΎΡΠΎΠΉ
++wc_cur;
done = true;
}break;
case L'#':
{
if (L'0' <= *text_cur && *text_cur <= L'9')
{
//Π·Π²Π΅Π·Π΄Π° ΡΠΌΠ°ΡΡΠΈΠ»Π°ΡΡ Ρ ΠΏΡΡΡΠΎΡΠΎΠΉ
++wc_cur;
done = true;
}
}break;
case L'*':
{
//Π·Π²Π΅Π·Π΄Π° ΡΠΌΠ°ΡΡΠΈΠ»Π°ΡΡ Ρ ΠΏΡΡΡΠΎΡΠΎΠΉ
++wc_cur;
//Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ΄ΡΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π²Π΅Π·Π΄Ρ
//done=true;
}break;
case L'[':
{
auto wc_past_next = wc_next + 1;
if (wc_past_next != wc_end && SBInfo.Parse({ &*wc_past_next, size_t(wc_end - wc_past_next) }))
{
//Π΄Π°Π»ΡΡΠ΅ Π»Π΅ΠΆΠ°Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ
++wc_cur;
done = true;
}
else
{
//ΡΡΠΈΡΠ°Π΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ
//Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» - Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°ΡΡΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ
if (*wc_next == *text_cur)
{
++wc_cur;
done = true;
}
}
}break;
}
}
else
{
//ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² ΠΌΠ°ΡΠΊΠ΅ Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ - ΠΌΠ°ΡΡΠΈΡΡΡ
return true;
}
} while (!done && wc_cur != wc_end && text_cur != text_end);
}break;
case L'[':
{
auto wc_next = wc_cur + 1;
if (wc_next != wc_end && SBInfo.Parse({ &*wc_next, size_t(wc_end - wc_next) }))
{
//ΡΠΈΠΌΠ²ΠΎΠ» ΡΡΡΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»Π΅ΠΆΠ°ΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅
if (SBInfo.TestChar(*text_cur))
{
wc_cur = wc_next + SBInfo.PosOfClosingBracket() + 1;
++text_cur;
}
else
{
return false;
}
}
else
{
//ΡΡΠΈΡΠ°Π΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ
//Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» - Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°ΡΡΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ
if (*wc_cur == *text_cur)
{
++wc_cur;
++text_cur;
}
else
{
return false;
}
}
}break;
}
}
//#todo - ΡΡΠΈ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ Ρ ΠΎΠ΄Π½ΠΈΠΌ return
if (wc_cur != wc_end) return false;
if (text_cur != text_end) return false;
return true;
}
bool check(wchar_t* s, wchar_t* p)
{
wchar_t* rs = 0, * rp=0;
while (1)
if (*p == L'*')
rs = s, rp = ++p;
else if (!*s)
return !*p;
else if (*s == *p || *p == L'?')
++s, ++p;
else if (rs)
s = ++rs, p = rp;
else
return false;
}
bool LikeVB(const wchar_t* s, const wchar_t* p)
{
const wchar_t* rs = 0, * rp = 0;
while (1) {
if (*p == L'[') {
bool b = false, res = false;
if (*(++p) == L'!') { b = true; ++p; }
while (*p != L']') {
if (*p == L'\0') { throw 93; }//Π΅ΡΠ»ΠΈ Π·Π°Π±ΡΠ»ΠΈ Π·Π°ΠΊΡΡΠ²Π°ΡΡΡΡ ΡΠΊΠΎΠ±ΠΊΡ//return false;
if (*(p + 1) == L'-' && *(p + 2) != L']')//Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ... - ...
{
//if (*(p+2) == L'\0') { return false; }//Π΅ΡΠ»ΠΈ Π·Π°Π±ΡΠ»ΠΈ Π·Π°ΠΊΡΡΠ²Π°ΡΡΡΡ ΡΠΊΠΎΠ±ΠΊΡ
if (*s >= *p && *s <= *(p + 2))
{
if (b) { return false; }//Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ
else { res = true; }//Π΅ΡΠ»ΠΈ Π½Π°ΡΠ»ΠΈ//break;
}
p += 2;
}
else { //Π΅ΡΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ»
if (*s == *p) {
if (b) { return false; }//Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ
else { res = true; }//Π΅ΡΠ»ΠΈ Π½Π°ΡΠ»ΠΈ// res=true;
}
++p;
}
}
if (b == res) return false;
++p;//Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΊΠΎΠ±ΠΊΠ°
++s;
}
else if (*p == L'*') {
rs = s, rp = ++p;
}
else if (!*s) {
return !*p;
}
else if (*p == L'#') {
if (*s <= L'9' && *s >= L'0') {
++s, ++p;
}
else {
return false; //++p;//or return false????
}
}
else if (*s == *p || *p == L'?') {
++s, ++p;
}
else if (rs) {
s = ++rs, p = rp;
}
else {
return false;
}
}
}
int main()
{
try {
int iMax = 1600000;// 16000000;
std::chrono::steady_clock::time_point timeStart;
std::chrono::steady_clock::time_point timeStop;
std::vector < std::vector<const wchar_t* >> testArr =
{
{L"XYXZZXY", L"*X*X?",L"True"}, //' Speed test
{L"aBBBa", L"a*a",L"True"},
{L"F" , L"[A-Z]" ,L"True"},
{L"F" , L"[!A-Z]",NULL},
{L"a2a" , L"a#a", L"True"},
{L"aM5b" , L"a[L-P]#[!c-e]", L"True"},
{L"BAT123khg" , L"B?T*", L"True"},
{L"CAT123khg" , L"B?T*",NULL},
{L"ab" , L"a*b",L"True"},
{L"a*b" , L"a [*]b", NULL},
{L"axxxxxb" , L"a [*]b",NULL},
{L"a [xyz" , L"a [[]*", L"True"},
{L"aM5b" , L"a*?b", L"True"},
//{L"aM5b" , L"a*[1-4-9][!c-e]", L"True"},
//{L"aM55b" , L"a*[1-4-9][!c-e]", L"True"},
//{L"aM5b" , L"*#[!c-e]", L"True"},
//{L"" , L"[]", L"True"},
//{L"", L"*", L"True"},
//{L"", L"", L"True"},
//{L"*", L"", NULL},
//{L"5*", L"5[*]", L"True"},
//{L"?n", L"[?]n", L"True"},
//{L"a", L"[a-cdf]", L"True"},
//{L"b", L"[a-cdf]", L"True"},
//{L"c", L"[a-cdf]", L"True"},
//{L"d", L"[a-cdf]", L"True"},
//{L"f", L"[a-cdf]", L"True"},
//{L"-", L"[-acdf]", L"True"},
//{L"a", L"[-acdf]", L"True"},
//{L"c", L"[-acdf]", L"True"},
//{L"d", L"[-acdf]", L"True"},
//{L"f", L"[-acdf]", L"True"},
//{L"[", L"[ [ ]", L"True"},
//{L"]", L"]", L"True"},
//{L"abc_d", L"abc[_]d*", L"True"},
//{L"abc_de", L"abc[_]d*", L"True"},
//{L"abcd", L"abc[def]", L"True"},
//{L"abce", L"abc[def]", L"True"},
//{L"abcf", L"abc[def]", L"True"},
//{L"abcdef", L"abc*[de]ef", L"True"},
//{L"abcyef", L"abc[xz]ef", NULL},
//{L"abcxef", L"abc[xz]ef", L"True"},
//{L"abcyef", L"abc[!xz]ef", L"True"},
//{L"abcxef", L"abc[!xz]ef", NULL},
{L"ac5c5b", L"a*[1-56-9][!c-e]", L"True"}
//{L"a [xyz" , L"a [*", NULL} //' Throws Error 93 (invalid pattern string).
};
std::wcout << L"Test pattern...";
std::wcout << L"\n\ncheck...";
for (int i = 0; i < testArr.size(); i++) {
if (check((wchar_t*)testArr[i][0], (wchar_t*)testArr[i][1]) != (bool)testArr[i][2]) {
std::wcout << std::wstring(L"\nERR: string, pattern-> '") + testArr[i][0] + L"', '" + testArr[i][1] + L"'";
}
}
std::wcout << L"\n\nLikeVB...";
for (int i = 0; i < testArr.size(); i++) {
if (LikeVB(testArr[i][0], testArr[i][1]) != (bool)testArr[i][2]) {
std::wcout << std::wstring(L"\nERR: string, pattern-> '") + testArr[i][0] + L"', '" + testArr[i][1] + L"'";
}
}
std::wcout << L"\n\nMatchWildcardAndText...";
for (int i = 0; i < testArr.size(); i++) {
if (MatchWildcardAndText(testArr[i][0], testArr[i][1]) != (bool)testArr[i][2]) {
std::wcout << std::wstring(L"\nERR: string-> ") + testArr[i][0] + L" pattern-> " + testArr[i][1];
}
}
std::wcout << L"\n\nSpeed test...";
timeStart = std::chrono::steady_clock::now();
for (int i = 0; i < iMax; i++) {
check((wchar_t*)testArr[0][0], (wchar_t*)testArr[0][1]);
}
timeStop = std::chrono::steady_clock::now();
std::wcout << L"\n\ncheck, ms: " + std::to_wstring(std::chrono::duration_cast<std::chrono::milliseconds> (timeStop - timeStart).count());
timeStart = std::chrono::steady_clock::now();
for (int i = 0; i < iMax; i++) {
LikeVB(testArr[0][0], testArr[0][1]);
}
timeStop = std::chrono::steady_clock::now();
std::wcout << L"\n\nLikeVB, ms: " + std::to_wstring(std::chrono::duration_cast<std::chrono::milliseconds> (timeStop - timeStart).count());
timeStart = std::chrono::steady_clock::now();
for (int i = 0; i < iMax; i++) {
MatchWildcardAndText(testArr[0][0], testArr[0][1]);
}
timeStop = std::chrono::steady_clock::now();
std::wcout << L"\n\nMatchWildcardAndText, ms: " + std::to_wstring(std::chrono::duration_cast<std::chrono::milliseconds> (timeStop - timeStart).count());
std::wcout << L"\n\n";
system("pause");
return 0;
}
catch (int& e) { system("pause"); return e; }
catch (...) { system("pause"); return -1; }
}