Index: src/libchcore/TStringPattern.cpp
===================================================================
diff -u -N
--- src/libchcore/TStringPattern.cpp	(revision 0)
+++ src/libchcore/TStringPattern.cpp	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -0,0 +1,142 @@
+#include "stdafx.h"
+#include "TStringPattern.h"
+#include <tchar.h>
+
+using namespace string;
+
+namespace chcore
+{
+	namespace
+	{
+		bool _tcicmp(TCHAR c1, TCHAR c2)
+		{
+			TCHAR ch1[2] = { c1, 0 }, ch2[2] = { c2, 0 };
+			return (_tcsicmp(ch1, ch2) == 0);
+		}
+	}
+
+	TStringPattern::TStringPattern(EPatternType ePatternType) :
+		m_ePatternType(ePatternType)
+	{
+	}
+
+	TStringPattern::TStringPattern(const TString& strPattern, EPatternType ePatternType) :
+		m_strPattern(strPattern),
+		m_ePatternType(ePatternType)
+	{
+	}
+
+	TStringPattern TStringPattern::CreateFromString(const TString& strPattern, EPatternType eDefaultPatternType)
+	{
+		TStringPattern pattern;
+		pattern.FromString(strPattern, eDefaultPatternType);
+		return pattern;
+	}
+
+	void TStringPattern::FromString(const TString& strPattern, EPatternType eDefaultPatternType)
+	{
+		m_ePatternType = eDefaultPatternType;
+		if (strPattern.StartsWith(L"WC;"))
+		{
+			m_strPattern = strPattern.Mid(3);
+			m_ePatternType = EPatternType::eType_Wildcard;
+		}
+		else
+			m_strPattern = strPattern;
+	}
+
+	TString TStringPattern::ToString() const
+	{
+		TString strPrefix;
+		switch (m_ePatternType)
+		{
+		case EPatternType::eType_Wildcard:
+			break;	// wildcard won't have any prefix (it's implicit)
+
+		default:
+			throw std::invalid_argument("Pattern type not supported");
+		}
+
+		return TString(strPrefix + m_strPattern);
+	}
+
+	bool TStringPattern::operator!=(const TStringPattern& rSrc) const
+	{
+		return m_ePatternType != rSrc.m_ePatternType || m_strPattern != rSrc.m_strPattern;
+	}
+
+	bool TStringPattern::operator==(const TStringPattern& rSrc) const
+	{
+		return m_ePatternType == rSrc.m_ePatternType && m_strPattern == rSrc.m_strPattern;
+	}
+
+	bool TStringPattern::MatchMask(LPCTSTR lpszMask, LPCTSTR lpszString) const
+	{
+		bool bMatch = true;
+
+		//iterate and delete '?' and '*' one by one
+		while (*lpszMask != _T('\0') && bMatch && *lpszString != _T('\0'))
+		{
+			if (*lpszMask == _T('?')) lpszString++;
+			else if (*lpszMask == _T('*'))
+			{
+				bMatch = Scan(lpszMask, lpszString);
+				lpszMask--;
+			}
+			else
+			{
+				bMatch = _tcicmp(*lpszMask, *lpszString);
+				lpszString++;
+			}
+			lpszMask++;
+		}
+		while (*lpszMask == _T('*') && bMatch)
+			lpszMask++;
+
+		return bMatch && *lpszString == _T('\0') && *lpszMask == _T('\0');
+	}
+
+	// scan '?' and '*'
+	bool TStringPattern::Scan(LPCTSTR& lpszMask, LPCTSTR& lpszString) const
+	{
+		// remove the '?' and '*'
+		for (lpszMask++; *lpszString != _T('\0') && (*lpszMask == _T('?') || *lpszMask == _T('*')); lpszMask++)
+			if (*lpszMask == _T('?')) lpszString++;
+		while (*lpszMask == _T('*')) lpszMask++;
+
+		// if lpszString is empty and lpszMask has more characters or,
+		// lpszMask is empty, return 
+		if (*lpszString == _T('\0') && *lpszMask != _T('\0'))
+			return false;
+		if (*lpszString == _T('\0') && *lpszMask == _T('\0'))
+			return true;
+		// else search substring
+		LPCTSTR wdsCopy = lpszMask;
+		LPCTSTR lpszStringCopy = lpszString;
+		bool bMatch = true;
+		do
+		{
+			if (!MatchMask(lpszMask, lpszString)) lpszStringCopy++;
+			lpszMask = wdsCopy;
+			lpszString = lpszStringCopy;
+			while (!(_tcicmp(*lpszMask, *lpszString)) && (*lpszString != '\0')) lpszString++;
+			wdsCopy = lpszMask;
+			lpszStringCopy = lpszString;
+		} while ((*lpszString != _T('\0')) ? !MatchMask(lpszMask, lpszString) : (bMatch = false) != false);
+
+		if (*lpszString == _T('\0') && *lpszMask == _T('\0')) return true;
+
+		return bMatch;
+	}
+
+	bool TStringPattern::Matches(const TString& strTextToMatch) const
+	{
+		return MatchMask(m_strPattern.c_str(), strTextToMatch.c_str());
+	}
+
+	void TStringPattern::SetPattern(const TString& strPattern, EPatternType ePatternType)
+	{
+		m_ePatternType = ePatternType;
+		m_strPattern = strPattern;
+	}
+}
Index: src/libstring/TStringPattern.cpp
===================================================================
diff -u -N
--- src/libstring/TStringPattern.cpp	(revision fadd6c9c628de875716d96c3a497b5bc6c8dca8a)
+++ src/libstring/TStringPattern.cpp	(revision 0)
@@ -1,141 +0,0 @@
-#include "stdafx.h"
-#include "TStringPattern.h"
-#include <tchar.h>
-#include "TStringException.h"
-
-namespace string
-{
-	namespace
-	{
-		bool _tcicmp(TCHAR c1, TCHAR c2)
-		{
-			TCHAR ch1[2] = { c1, 0 }, ch2[2] = { c2, 0 };
-			return (_tcsicmp(ch1, ch2) == 0);
-		}
-	}
-
-	TStringPattern::TStringPattern(EPatternType ePatternType) :
-		m_ePatternType(ePatternType)
-	{
-	}
-
-	TStringPattern::TStringPattern(const TString& strPattern, EPatternType ePatternType) :
-		m_strPattern(strPattern),
-		m_ePatternType(ePatternType)
-	{
-	}
-
-	TStringPattern TStringPattern::CreateFromString(const TString& strPattern, EPatternType eDefaultPatternType)
-	{
-		TStringPattern pattern;
-		pattern.FromString(strPattern, eDefaultPatternType);
-		return pattern;
-	}
-
-	void TStringPattern::FromString(const TString& strPattern, EPatternType eDefaultPatternType)
-	{
-		m_ePatternType = eDefaultPatternType;
-		if (strPattern.StartsWith(L"WC;"))
-		{
-			m_strPattern = strPattern.Mid(3);
-			m_ePatternType = EPatternType::eType_Wildcard;
-		}
-		else
-			m_strPattern = strPattern;
-	}
-
-	TString TStringPattern::ToString() const
-	{
-		TString strPrefix;
-		switch (m_ePatternType)
-		{
-		case EPatternType::eType_Wildcard:
-			break;	// wildcard won't have any prefix (it's implicit)
-
-		default:
-			throw TStringException("Pattern type not supported");
-		}
-
-		return TString(strPrefix + m_strPattern);
-	}
-
-	bool TStringPattern::operator!=(const TStringPattern& rSrc) const
-	{
-		return m_ePatternType != rSrc.m_ePatternType || m_strPattern != rSrc.m_strPattern;
-	}
-
-	bool TStringPattern::operator==(const TStringPattern& rSrc) const
-	{
-		return m_ePatternType == rSrc.m_ePatternType && m_strPattern == rSrc.m_strPattern;
-	}
-
-	bool TStringPattern::MatchMask(LPCTSTR lpszMask, LPCTSTR lpszString) const
-	{
-		bool bMatch = true;
-
-		//iterate and delete '?' and '*' one by one
-		while (*lpszMask != _T('\0') && bMatch && *lpszString != _T('\0'))
-		{
-			if (*lpszMask == _T('?')) lpszString++;
-			else if (*lpszMask == _T('*'))
-			{
-				bMatch = Scan(lpszMask, lpszString);
-				lpszMask--;
-			}
-			else
-			{
-				bMatch = _tcicmp(*lpszMask, *lpszString);
-				lpszString++;
-			}
-			lpszMask++;
-		}
-		while (*lpszMask == _T('*') && bMatch)
-			lpszMask++;
-
-		return bMatch && *lpszString == _T('\0') && *lpszMask == _T('\0');
-	}
-
-	// scan '?' and '*'
-	bool TStringPattern::Scan(LPCTSTR& lpszMask, LPCTSTR& lpszString) const
-	{
-		// remove the '?' and '*'
-		for (lpszMask++; *lpszString != _T('\0') && (*lpszMask == _T('?') || *lpszMask == _T('*')); lpszMask++)
-			if (*lpszMask == _T('?')) lpszString++;
-		while (*lpszMask == _T('*')) lpszMask++;
-
-		// if lpszString is empty and lpszMask has more characters or,
-		// lpszMask is empty, return 
-		if (*lpszString == _T('\0') && *lpszMask != _T('\0'))
-			return false;
-		if (*lpszString == _T('\0') && *lpszMask == _T('\0'))
-			return true;
-		// else search substring
-		LPCTSTR wdsCopy = lpszMask;
-		LPCTSTR lpszStringCopy = lpszString;
-		bool bMatch = true;
-		do
-		{
-			if (!MatchMask(lpszMask, lpszString)) lpszStringCopy++;
-			lpszMask = wdsCopy;
-			lpszString = lpszStringCopy;
-			while (!(_tcicmp(*lpszMask, *lpszString)) && (*lpszString != '\0')) lpszString++;
-			wdsCopy = lpszMask;
-			lpszStringCopy = lpszString;
-		} while ((*lpszString != _T('\0')) ? !MatchMask(lpszMask, lpszString) : (bMatch = false) != false);
-
-		if (*lpszString == _T('\0') && *lpszMask == _T('\0')) return true;
-
-		return bMatch;
-	}
-
-	bool TStringPattern::Matches(const TString& strTextToMatch) const
-	{
-		return MatchMask(m_strPattern.c_str(), strTextToMatch.c_str());
-	}
-
-	void TStringPattern::SetPattern(const TString& strPattern, EPatternType ePatternType)
-	{
-		m_ePatternType = ePatternType;
-		m_strPattern = strPattern;
-	}
-}
Index: src/libchcore/TStringPattern.h
===================================================================
diff -u -N
--- src/libchcore/TStringPattern.h	(revision 0)
+++ src/libchcore/TStringPattern.h	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -0,0 +1,61 @@
+// ============================================================================
+//  Copyright (C) 2001-2020 by Jozef Starosczyk
+//  ixen {at} copyhandler [dot] com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
+#pragma once
+
+#include "../libstring/TString.h"
+#include "libchcore.h"
+
+namespace chcore
+{
+	class LIBCHCORE_API TStringPattern
+	{
+	public:
+		enum class EPatternType
+		{
+			eType_Wildcard
+		};
+
+	public:
+		explicit TStringPattern(EPatternType ePatternType = EPatternType::eType_Wildcard);
+		explicit TStringPattern(const string::TString& strPattern, EPatternType ePatternType = EPatternType::eType_Wildcard);
+
+		void SetPattern(const string::TString& strPattern, EPatternType ePatternType = EPatternType::eType_Wildcard);
+		bool Matches(const string::TString& strTextToMatch) const;
+
+		EPatternType GetPatternType() const { return m_ePatternType; }
+		string::TString GetPattern() const { return m_strPattern; }
+
+		// string parsing
+		static TStringPattern CreateFromString(const string::TString& strPattern, EPatternType eDefaultPatternType = EPatternType::eType_Wildcard);
+
+		void FromString(const string::TString& strPattern, EPatternType eDefaultPatternType = EPatternType::eType_Wildcard);
+		string::TString ToString() const;
+
+		bool operator==(const TStringPattern& rSrc) const;
+		bool operator!=(const TStringPattern& rSrc) const;
+
+	private:
+		bool MatchMask(LPCTSTR lpszMask, LPCTSTR lpszString) const;
+		bool Scan(LPCTSTR& lpszMask, LPCTSTR& lpszString) const;
+
+	private:
+		string::TString m_strPattern;
+		EPatternType m_ePatternType;
+	};
+}
Index: src/libchcore/TStringPatternArray.cpp
===================================================================
diff -u -N
--- src/libchcore/TStringPatternArray.cpp	(revision 0)
+++ src/libchcore/TStringPatternArray.cpp	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -0,0 +1,100 @@
+// ============================================================================
+//  Copyright (C) 2001-2020 by Jozef Starosczyk
+//  ixen {at} copyhandler [dot] com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
+#include "stdafx.h"
+#include "TStringPatternArray.h"
+#include "../libstring/TStringArray.h"
+
+using namespace string;
+
+namespace chcore
+{
+	bool TStringPatternArray::MatchesAny(const TString& strTextToMatch) const
+	{
+		for (const TStringPattern& pattern : m_vItems)
+		{
+			if (pattern.Matches(strTextToMatch))
+				return true;
+		}
+
+		return false;
+	}
+
+	bool TStringPatternArray::MatchesAll(const TString& strTextToMatch) const
+	{
+		for (const TStringPattern& pattern : m_vItems)
+		{
+			if (!pattern.Matches(strTextToMatch))
+				return false;
+		}
+
+		return true;
+	}
+
+	void TStringPatternArray::FromString(const TString& strPatterns, TStringPattern::EPatternType eDefaultPatternType)
+	{
+		TStringArray arrPatterns;
+		strPatterns.Split(_T("|"), arrPatterns);
+		FromStringArray(arrPatterns, eDefaultPatternType);
+	}
+
+	void TStringPatternArray::FromSerializedStringArray(const TStringArray& arrSerializedPatterns)
+	{
+		m_vItems.clear();
+
+		for (size_t stIndex = 0; stIndex < arrSerializedPatterns.GetCount(); ++stIndex)
+		{
+			m_vItems.push_back(TStringPattern::CreateFromString(arrSerializedPatterns.GetAt(stIndex)));
+		}
+	}
+
+	void TStringPatternArray::FromStringArray(const TStringArray& arrPatterns, TStringPattern::EPatternType eDefaultPatternType)
+	{
+		for (size_t stIndex = 0; stIndex < arrPatterns.GetCount(); ++stIndex)
+		{
+			Add(TStringPattern::CreateFromString(arrPatterns.GetAt(stIndex), eDefaultPatternType));
+		}
+	}
+
+	TString TStringPatternArray::ToString() const
+	{
+		TString strMask;
+		size_t stCount = GetCount();
+		if (stCount > 0)
+		{
+			strMask = GetAt(0).ToString();
+			for (size_t stIndex = 1; stIndex < stCount; stIndex++)
+			{
+				strMask += _T("|") + GetAt(stIndex).ToString();
+			}
+		}
+
+		return strMask;
+	}
+
+	TStringArray TStringPatternArray::ToSerializedStringArray() const
+	{
+		TStringArray arrSerialized;
+		for (const TStringPattern& pattern : m_vItems)
+		{
+			arrSerialized.Add(pattern.ToString());
+		}
+
+		return arrSerialized;
+	}
+}
Index: src/libstring/TStringPatternArray.cpp
===================================================================
diff -u -N
--- src/libstring/TStringPatternArray.cpp	(revision fadd6c9c628de875716d96c3a497b5bc6c8dca8a)
+++ src/libstring/TStringPatternArray.cpp	(revision 0)
@@ -1,99 +0,0 @@
-// ============================================================================
-//  Copyright (C) 2001-2015 by Jozef Starosczyk
-//  ixen@copyhandler.com
-//
-//  This program is free software; you can redistribute it and/or modify
-//  it under the terms of the GNU Library General Public License
-//  (version 2) as published by the Free Software Foundation;
-//
-//  This program is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//  GNU General Public License for more details.
-//
-//  You should have received a copy of the GNU Library General Public
-//  License along with this program; if not, write to the
-//  Free Software Foundation, Inc.,
-//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// ============================================================================
-#include "stdafx.h"
-#include "TStringPatternArray.h"
-#include "TStringArray.h"
-#include "TStringException.h"
-
-namespace string
-{
-	bool TStringPatternArray::MatchesAny(const TString& strTextToMatch) const
-	{
-		for (const TStringPattern& pattern : m_vItems)
-		{
-			if (pattern.Matches(strTextToMatch))
-				return true;
-		}
-
-		return false;
-	}
-
-	bool TStringPatternArray::MatchesAll(const TString& strTextToMatch) const
-	{
-		for (const TStringPattern& pattern : m_vItems)
-		{
-			if (!pattern.Matches(strTextToMatch))
-				return false;
-		}
-
-		return true;
-	}
-
-	void TStringPatternArray::FromString(const TString& strPatterns, TStringPattern::EPatternType eDefaultPatternType)
-	{
-		TStringArray arrPatterns;
-		strPatterns.Split(_T("|"), arrPatterns);
-		FromStringArray(arrPatterns, eDefaultPatternType);
-	}
-
-	void TStringPatternArray::FromSerializedStringArray(const TStringArray& arrSerializedPatterns)
-	{
-		m_vItems.clear();
-
-		for (size_t stIndex = 0; stIndex < arrSerializedPatterns.GetCount(); ++stIndex)
-		{
-			m_vItems.push_back(TStringPattern::CreateFromString(arrSerializedPatterns.GetAt(stIndex)));
-		}
-	}
-
-	void TStringPatternArray::FromStringArray(const TStringArray& arrPatterns, TStringPattern::EPatternType eDefaultPatternType)
-	{
-		for (size_t stIndex = 0; stIndex < arrPatterns.GetCount(); ++stIndex)
-		{
-			Add(TStringPattern::CreateFromString(arrPatterns.GetAt(stIndex), eDefaultPatternType));
-		}
-	}
-
-	TString TStringPatternArray::ToString() const
-	{
-		TString strMask;
-		size_t stCount = GetCount();
-		if (stCount > 0)
-		{
-			strMask = GetAt(0).ToString();
-			for (size_t stIndex = 1; stIndex < stCount; stIndex++)
-			{
-				strMask += _T("|") + GetAt(stIndex).ToString();
-			}
-		}
-
-		return strMask;
-	}
-
-	TStringArray TStringPatternArray::ToSerializedStringArray() const
-	{
-		TStringArray arrSerialized;
-		for (const TStringPattern& pattern : m_vItems)
-		{
-			arrSerialized.Add(pattern.ToString());
-		}
-
-		return arrSerialized;
-	}
-}
Index: src/libchcore/TStringPatternArray.h
===================================================================
diff -u -N
--- src/libchcore/TStringPatternArray.h	(revision 0)
+++ src/libchcore/TStringPatternArray.h	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -0,0 +1,55 @@
+// ============================================================================
+//  Copyright (C) 2001-2020 by Jozef Starosczyk
+//  ixen {at} copyhandler [dot] com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
+#pragma once
+
+#include "TStringPattern.h"
+#include "../common/GenericTemplates/RandomAccessIterators.h"
+#include "../common/GenericTemplates/RandomAccessContainerWrapper.h"
+
+namespace chcore
+{
+	template class LIBCHCORE_API RandomAccessIteratorWrapper<TStringPattern>;
+	class LIBCHCORE_API TStringPatternArrayIterator : public RandomAccessIteratorWrapper<TStringPattern>
+	{
+	};
+
+	template class LIBCHCORE_API RandomAccessConstIteratorWrapper<TStringPattern>;
+	class LIBCHCORE_API TStringPatternArrayConstIterator : public RandomAccessConstIteratorWrapper<TStringPattern>
+	{
+	};
+
+	template class LIBCHCORE_API RandomAccessContainerWrapper<TStringPattern>;
+
+	class LIBCHCORE_API TStringPatternArray : public RandomAccessContainerWrapper<TStringPattern>
+	{
+	public:
+		// pattern api
+		bool MatchesAny(const string::TString& strTextToMatch) const;
+		bool MatchesAll(const string::TString& strTextToMatch) const;
+
+		// string parsing
+		void FromString(const string::TString& strPatterns, TStringPattern::EPatternType eDefaultPatternType = TStringPattern::EPatternType::eType_Wildcard);
+		void FromStringArray(const string::TStringArray& strPatterns, TStringPattern::EPatternType eDefaultPatternType = TStringPattern::EPatternType::eType_Wildcard);
+		string::TString ToString() const;
+
+		// serialization
+		void FromSerializedStringArray(const string::TStringArray& arrSerializedPatterns);
+		string::TStringArray ToSerializedStringArray() const;
+	};
+}
Index: src/libchcore/Tests/TestsTStringPattern.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TestsTStringPattern.cpp	(revision 0)
+++ src/libchcore/Tests/TestsTStringPattern.cpp	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -0,0 +1,114 @@
+#include "stdafx.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "../TStringPattern.h"
+
+using namespace chcore;
+
+TEST(TestsTStringPattern, DefaultConstruction)
+{
+	TStringPattern patternEmpty;
+	EXPECT_STREQ(L"", patternEmpty.ToString().c_str());
+	EXPECT_STREQ(L"", patternEmpty.GetPattern().c_str());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+}
+
+TEST(TestsTStringPattern, PatternConstruction)
+{
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
+	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+}
+
+TEST(TestsTStringPattern, SetPattern)
+{
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+
+	patternEmpty.SetPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_STREQ(L"*.bat", patternEmpty.ToString().c_str());
+	EXPECT_STREQ(L"*.bat", patternEmpty.GetPattern().c_str());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+}
+
+TEST(TestsTStringPattern, CreateFromSerializedString)
+{
+	TStringPattern patternEmpty = TStringPattern::CreateFromString(L"WC;*.*");
+
+	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
+	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+}
+
+TEST(TestsTStringPattern, FromStringString)
+{
+	TStringPattern patternEmpty;
+	patternEmpty.FromString(L"WC;*.*");
+
+	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
+	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+}
+
+TEST(TestsTStringPattern, Matches_Positive_StarDotBat)
+{
+	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(L"autorun.bat"));
+}
+
+TEST(TestsTStringPattern, Matches_Negative_StarDotBat)
+{
+	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_FALSE(patternEmpty.Matches(L"autorun.batx"));
+}
+
+TEST(TestsTStringPattern, Matches_Positive_StarDotStar)
+{
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(L"autorun.bat"));
+}
+
+TEST(TestsTStringPattern, Matches_Negative_StarDotStar)
+{
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_FALSE(patternEmpty.Matches(L"autorun"));
+}
+
+///////////////////////////////////////////////////////////
+// Multiple asterisks
+
+TEST(TestsTStringPattern, Matches_Positive_MultiStar)
+{
+	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(L"addon-boo.bat"));
+}
+
+TEST(TestsTStringPattern, Matches_Negative_MultiStar)
+{
+	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_FALSE(patternEmpty.Matches(L"addon-doo.bat"));
+}
+
+////////////////////////////////////////////////////////////
+// asterisks
+
+TEST(TestsTStringPattern, Matches_Positive_QuestionMultiPos)
+{
+	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(L"arbbar"));
+}
+
+TEST(TestsTStringPattern, Matches_Negative_QuestionMultiPos)
+{
+	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_Wildcard);
+
+	EXPECT_FALSE(patternEmpty.Matches(L"arbxar"));
+}
Index: src/libstring/Tests/TestsTStringPattern.cpp
===================================================================
diff -u -N
--- src/libstring/Tests/TestsTStringPattern.cpp	(revision 0d5b67ee96b435d63f7bf075dc8e28603793b187)
+++ src/libstring/Tests/TestsTStringPattern.cpp	(revision 0)
@@ -1,114 +0,0 @@
-#include "stdafx.h"
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-#include "../TStringPattern.h"
-
-using namespace string;
-
-TEST(TestsTStringPattern, DefaultConstruction)
-{
-	TStringPattern patternEmpty;
-	EXPECT_STREQ(L"", patternEmpty.ToString().c_str());
-	EXPECT_STREQ(L"", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
-}
-
-TEST(TestsTStringPattern, PatternConstruction)
-{
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
-	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
-	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
-}
-
-TEST(TestsTStringPattern, SetPattern)
-{
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
-
-	patternEmpty.SetPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_STREQ(L"*.bat", patternEmpty.ToString().c_str());
-	EXPECT_STREQ(L"*.bat", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
-}
-
-TEST(TestsTStringPattern, CreateFromSerializedString)
-{
-	TStringPattern patternEmpty = TStringPattern::CreateFromString(L"WC;*.*");
-
-	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
-	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
-}
-
-TEST(TestsTStringPattern, FromStringString)
-{
-	TStringPattern patternEmpty;
-	patternEmpty.FromString(L"WC;*.*");
-
-	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
-	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
-}
-
-TEST(TestsTStringPattern, Matches_Positive_StarDotBat)
-{
-	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_TRUE(patternEmpty.Matches(L"autorun.bat"));
-}
-
-TEST(TestsTStringPattern, Matches_Negative_StarDotBat)
-{
-	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_FALSE(patternEmpty.Matches(L"autorun.batx"));
-}
-
-TEST(TestsTStringPattern, Matches_Positive_StarDotStar)
-{
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_TRUE(patternEmpty.Matches(L"autorun.bat"));
-}
-
-TEST(TestsTStringPattern, Matches_Negative_StarDotStar)
-{
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_FALSE(patternEmpty.Matches(L"autorun"));
-}
-
-///////////////////////////////////////////////////////////
-// Multiple asterisks
-
-TEST(TestsTStringPattern, Matches_Positive_MultiStar)
-{
-	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_TRUE(patternEmpty.Matches(L"addon-boo.bat"));
-}
-
-TEST(TestsTStringPattern, Matches_Negative_MultiStar)
-{
-	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_FALSE(patternEmpty.Matches(L"addon-doo.bat"));
-}
-
-////////////////////////////////////////////////////////////
-// asterisks
-
-TEST(TestsTStringPattern, Matches_Positive_QuestionMultiPos)
-{
-	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_TRUE(patternEmpty.Matches(L"arbbar"));
-}
-
-TEST(TestsTStringPattern, Matches_Negative_QuestionMultiPos)
-{
-	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_FALSE(patternEmpty.Matches(L"arbxar"));
-}
Index: src/libchcore/Tests/TestsTStringPatternArray.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TestsTStringPatternArray.cpp	(revision 0)
+++ src/libchcore/Tests/TestsTStringPatternArray.cpp	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -0,0 +1,150 @@
+#include "stdafx.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "../TStringPatternArray.h"
+#include "../../libstring/TStringArray.h"
+
+using namespace string;
+using namespace chcore;
+
+TEST(TestsTStringPatternArray, DefaultConstruction)
+{
+	TStringPatternArray arrPatterns;
+
+	EXPECT_EQ(0UL, arrPatterns.GetCount());
+}
+
+TEST(TestsTStringPatternArray, AddElements)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_EQ(2UL, arrPatterns.GetCount());
+	EXPECT_STREQ(L"*.bat", arrPatterns.GetAt(0).ToString().c_str());
+	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(1).ToString().c_str());
+}
+
+TEST(TestsTStringPatternArray, InsertAt)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.InsertAt(0, TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.InsertAt(0, TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_EQ(2UL, arrPatterns.GetCount());
+	EXPECT_STREQ(L"*.bat", arrPatterns.GetAt(1).ToString().c_str());
+	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(0).ToString().c_str());
+}
+
+TEST(TestsTStringPatternArray, SetAt)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	arrPatterns.SetAt(0, TStringPattern(L"*.com", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_EQ(2UL, arrPatterns.GetCount());
+	EXPECT_STREQ(L"*.com", arrPatterns.GetAt(0).ToString().c_str());
+	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(1).ToString().c_str());
+}
+
+TEST(TestsTStringPatternArray, RemoveAt)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	arrPatterns.RemoveAt(0);
+
+	EXPECT_EQ(1UL, arrPatterns.GetCount());
+	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(0).ToString().c_str());
+}
+
+TEST(TestsTStringPatternArray, Clear)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	arrPatterns.Clear();
+
+	EXPECT_EQ(0UL, arrPatterns.GetCount());
+}
+
+/////////////////////////////////////////////////
+// matches any
+TEST(TestsTStringPatternArray, MatchesAny_Positive)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_TRUE(arrPatterns.MatchesAny(L"autostart.bat"));
+}
+
+TEST(TestsTStringPatternArray, MatchesAny_Negative)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_FALSE(arrPatterns.MatchesAny(L"autostart.com"));
+}
+
+/////////////////////////////////////////////////
+// matches all
+TEST(TestsTStringPatternArray, MatchesAll_Positive)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"autostart.*", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_TRUE(arrPatterns.MatchesAll(L"autostart.bat"));
+}
+
+TEST(TestsTStringPatternArray, MatchesAll_Negative)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"autostart.*", TStringPattern::EPatternType::eType_Wildcard));
+
+	EXPECT_FALSE(arrPatterns.MatchesAll(L"autostart.exe"));
+}
+
+/////////////////////////////////////////////////
+// serialization
+TEST(TestsTStringPatternArray, ToStringArray)
+{
+	TStringPatternArray arrPatterns;
+
+	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
+	arrPatterns.Add(TStringPattern(L"autostart.*", TStringPattern::EPatternType::eType_Wildcard));
+
+	TStringArray arrElements = arrPatterns.ToSerializedStringArray();
+	EXPECT_EQ(2UL, arrElements.GetCount());
+	EXPECT_STREQ(L"*.bat", arrElements.GetAt(0).c_str());
+	EXPECT_STREQ(L"autostart.*", arrElements.GetAt(1).c_str());
+}
+
+TEST(TestsTStringPatternArray, FromStringArray)
+{
+	TStringArray arrElements;
+	arrElements.Add(L"*.bat");
+	arrElements.Add(L"autostart.*");
+
+	TStringPatternArray arrPatterns;
+	arrPatterns.FromStringArray(arrElements);
+
+	EXPECT_STREQ(L"*.bat", arrPatterns.GetAt(0).ToString().c_str());
+	EXPECT_STREQ(L"autostart.*", arrPatterns.GetAt(1).ToString().c_str());
+}
Index: src/libstring/Tests/TestsTStringPatternArray.cpp
===================================================================
diff -u -N
--- src/libstring/Tests/TestsTStringPatternArray.cpp	(revision 07f5ed57f11f0b908313f692fc4830401f0db552)
+++ src/libstring/Tests/TestsTStringPatternArray.cpp	(revision 0)
@@ -1,149 +0,0 @@
-#include "stdafx.h"
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-#include "../TStringPatternArray.h"
-#include "../TStringArray.h"
-
-using namespace string;
-
-TEST(TestsTStringPatternArray, DefaultConstruction)
-{
-	TStringPatternArray arrPatterns;
-
-	EXPECT_EQ(0UL, arrPatterns.GetCount());
-}
-
-TEST(TestsTStringPatternArray, AddElements)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_EQ(2UL, arrPatterns.GetCount());
-	EXPECT_STREQ(L"*.bat", arrPatterns.GetAt(0).ToString().c_str());
-	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(1).ToString().c_str());
-}
-
-TEST(TestsTStringPatternArray, InsertAt)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.InsertAt(0, TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.InsertAt(0, TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_EQ(2UL, arrPatterns.GetCount());
-	EXPECT_STREQ(L"*.bat", arrPatterns.GetAt(1).ToString().c_str());
-	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(0).ToString().c_str());
-}
-
-TEST(TestsTStringPatternArray, SetAt)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	arrPatterns.SetAt(0, TStringPattern(L"*.com", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_EQ(2UL, arrPatterns.GetCount());
-	EXPECT_STREQ(L"*.com", arrPatterns.GetAt(0).ToString().c_str());
-	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(1).ToString().c_str());
-}
-
-TEST(TestsTStringPatternArray, RemoveAt)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	arrPatterns.RemoveAt(0);
-
-	EXPECT_EQ(1UL, arrPatterns.GetCount());
-	EXPECT_STREQ(L"*.exe", arrPatterns.GetAt(0).ToString().c_str());
-}
-
-TEST(TestsTStringPatternArray, Clear)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	arrPatterns.Clear();
-
-	EXPECT_EQ(0UL, arrPatterns.GetCount());
-}
-
-/////////////////////////////////////////////////
-// matches any
-TEST(TestsTStringPatternArray, MatchesAny_Positive)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_TRUE(arrPatterns.MatchesAny(L"autostart.bat"));
-}
-
-TEST(TestsTStringPatternArray, MatchesAny_Negative)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"*.exe", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_FALSE(arrPatterns.MatchesAny(L"autostart.com"));
-}
-
-/////////////////////////////////////////////////
-// matches all
-TEST(TestsTStringPatternArray, MatchesAll_Positive)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"autostart.*", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_TRUE(arrPatterns.MatchesAll(L"autostart.bat"));
-}
-
-TEST(TestsTStringPatternArray, MatchesAll_Negative)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"autostart.*", TStringPattern::EPatternType::eType_Wildcard));
-
-	EXPECT_FALSE(arrPatterns.MatchesAll(L"autostart.exe"));
-}
-
-/////////////////////////////////////////////////
-// serialization
-TEST(TestsTStringPatternArray, ToStringArray)
-{
-	TStringPatternArray arrPatterns;
-
-	arrPatterns.Add(TStringPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard));
-	arrPatterns.Add(TStringPattern(L"autostart.*", TStringPattern::EPatternType::eType_Wildcard));
-
-	TStringArray arrElements = arrPatterns.ToSerializedStringArray();
-	EXPECT_EQ(2UL, arrElements.GetCount());
-	EXPECT_STREQ(L"*.bat", arrElements.GetAt(0).c_str());
-	EXPECT_STREQ(L"autostart.*", arrElements.GetAt(1).c_str());
-}
-
-TEST(TestsTStringPatternArray, FromStringArray)
-{
-	TStringArray arrElements;
-	arrElements.Add(L"*.bat");
-	arrElements.Add(L"autostart.*");
-
-	TStringPatternArray arrPatterns;
-	arrPatterns.FromStringArray(arrElements);
-
-	EXPECT_STREQ(L"*.bat", arrPatterns.GetAt(0).ToString().c_str());
-	EXPECT_STREQ(L"autostart.*", arrPatterns.GetAt(1).ToString().c_str());
-}
Index: src/libchcore/libchcore.vc140.vcxproj
===================================================================
diff -u -N -r2dea2d82eb5c11d9e92d42e47f876e58c4505c4b -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchcore/libchcore.vc140.vcxproj	(.../libchcore.vc140.vcxproj)	(revision 2dea2d82eb5c11d9e92d42e47f876e58c4505c4b)
+++ src/libchcore/libchcore.vc140.vcxproj	(.../libchcore.vc140.vcxproj)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -519,6 +519,8 @@
     <ClInclude Include="TCoreException.h" />
     <ClInclude Include="TPath.h" />
     <ClInclude Include="TSharedMemory.h" />
+    <ClInclude Include="TStringPattern.h" />
+    <ClInclude Include="TStringPatternArray.h" />
     <ClInclude Include="TTimestampProviderTickCount.h" />
     <ClInclude Include="TWin32ErrorFormatter.h" />
     <ClInclude Include="TWorkerThreadController.h" />
@@ -591,6 +593,18 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="Tests\TestsTStringPattern.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="Tests\TestsTStringPatternArray.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="Tests\TestsTTimestampProviderTickCount.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@@ -611,6 +625,8 @@
     <ClCompile Include="TCoreException.cpp" />
     <ClCompile Include="TPath.cpp" />
     <ClCompile Include="TSharedMemory.cpp" />
+    <ClCompile Include="TStringPattern.cpp" />
+    <ClCompile Include="TStringPatternArray.cpp" />
     <ClCompile Include="TTimestampProviderTickCount.cpp" />
     <ClCompile Include="TWin32ErrorFormatter.cpp" />
     <ClCompile Include="TWorkerThreadController.cpp" />
Index: src/libchcore/libchcore.vc140.vcxproj.filters
===================================================================
diff -u -N -r301444777085263aae7aff911dd56722f302597e -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchcore/libchcore.vc140.vcxproj.filters	(.../libchcore.vc140.vcxproj.filters)	(revision 301444777085263aae7aff911dd56722f302597e)
+++ src/libchcore/libchcore.vc140.vcxproj.filters	(.../libchcore.vc140.vcxproj.filters)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -105,6 +105,12 @@
     <ClInclude Include="..\common\GTestMacros.h">
       <Filter>Tests</Filter>
     </ClInclude>
+    <ClInclude Include="TStringPattern.h">
+      <Filter>Source Files\Tools</Filter>
+    </ClInclude>
+    <ClInclude Include="TStringPatternArray.h">
+      <Filter>Source Files\Tools</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="dllmain.cpp">
@@ -188,6 +194,18 @@
     <ClCompile Include="Tests\TestsTWorkerThreadController.cpp">
       <Filter>Tests</Filter>
     </ClCompile>
+    <ClCompile Include="TStringPatternArray.cpp">
+      <Filter>Source Files\Tools</Filter>
+    </ClCompile>
+    <ClCompile Include="TStringPattern.cpp">
+      <Filter>Source Files\Tools</Filter>
+    </ClCompile>
+    <ClCompile Include="Tests\TestsTStringPattern.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="Tests\TestsTStringPatternArray.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="libchcore.rc">
Index: src/libchengine/FeedbackAlreadyExistsRule.cpp
===================================================================
diff -u -N -rf8b6de9c28b2957db0b4e71efa11df8632e41261 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/FeedbackAlreadyExistsRule.cpp	(.../FeedbackAlreadyExistsRule.cpp)	(revision f8b6de9c28b2957db0b4e71efa11df8632e41261)
+++ src/libchengine/FeedbackAlreadyExistsRule.cpp	(.../FeedbackAlreadyExistsRule.cpp)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -5,6 +5,7 @@
 
 using namespace serializer;
 using namespace string;
+using namespace chcore;
 
 namespace chengine
 {
Index: src/libchengine/FeedbackAlreadyExistsRule.h
===================================================================
diff -u -N -rf8b6de9c28b2957db0b4e71efa11df8632e41261 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/FeedbackAlreadyExistsRule.h	(.../FeedbackAlreadyExistsRule.h)	(revision f8b6de9c28b2957db0b4e71efa11df8632e41261)
+++ src/libchengine/FeedbackAlreadyExistsRule.h	(.../FeedbackAlreadyExistsRule.h)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -2,7 +2,7 @@
 
 #include "libchengine.h"
 #include "../libserializer/SerializableObject.h"
-#include "../libstring/TStringPatternArray.h"
+#include "../libchcore/TStringPatternArray.h"
 #include "ECompareType.h"
 #include "EFeedbackResult.h"
 #include "../libserializer/SerializerDataTypes.h"
@@ -89,9 +89,9 @@
 
 	private:
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_UseMask> m_bUseMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_Mask> m_spaMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_Mask> m_spaMask;
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_UseExcludeMask> m_bUseExcludeMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_ExcludeMask> m_spaExcludeMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_ExcludeMask> m_spaExcludeMask;
 
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_UseDateCompare> m_bUseDateCompare;
 		serializer::TSharedModificationTracker<ECompareType, Bitset, FeedbackAlreadyExistsRuleEnum::eMod_DateCompare> m_cmpLastModified;
Index: src/libchengine/FeedbackErrorRule.h
===================================================================
diff -u -N -rf8b6de9c28b2957db0b4e71efa11df8632e41261 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/FeedbackErrorRule.h	(.../FeedbackErrorRule.h)	(revision f8b6de9c28b2957db0b4e71efa11df8632e41261)
+++ src/libchengine/FeedbackErrorRule.h	(.../FeedbackErrorRule.h)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -2,7 +2,7 @@
 
 #include "libchengine.h"
 #include "../libserializer/SerializableObject.h"
-#include "../libstring/TStringPatternArray.h"
+#include "../libchcore/TStringPatternArray.h"
 #include "ECompareType.h"
 #include "EFeedbackResult.h"
 #include "../libserializer/SerializerDataTypes.h"
@@ -88,9 +88,9 @@
 
 	private:
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackErrorRuleEnum::eMod_UseMask> m_bUseMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FeedbackErrorRuleEnum::eMod_Mask> m_spaMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FeedbackErrorRuleEnum::eMod_Mask> m_spaMask;
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackErrorRuleEnum::eMod_UseExcludeMask> m_bUseExcludeMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FeedbackErrorRuleEnum::eMod_ExcludeMask> m_spaExcludeMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FeedbackErrorRuleEnum::eMod_ExcludeMask> m_spaExcludeMask;
 
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackErrorRuleEnum::eMod_UseErrorType> m_bUseErrorType;
 		serializer::TSharedModificationTracker<EFileError, Bitset, FeedbackErrorRuleEnum::eMod_ErrorType> m_eErrorType;
Index: src/libchengine/FeedbackNotEnoughSpaceRule.h
===================================================================
diff -u -N -re6f64ea0eecaf86dfa1a42c80604d227b69be768 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/FeedbackNotEnoughSpaceRule.h	(.../FeedbackNotEnoughSpaceRule.h)	(revision e6f64ea0eecaf86dfa1a42c80604d227b69be768)
+++ src/libchengine/FeedbackNotEnoughSpaceRule.h	(.../FeedbackNotEnoughSpaceRule.h)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -2,7 +2,7 @@
 
 #include "libchengine.h"
 #include "../libserializer/SerializableObject.h"
-#include "../libstring/TStringPatternArray.h"
+#include "../libchcore/TStringPatternArray.h"
 #include "ECompareType.h"
 #include "EFeedbackResult.h"
 #include "../libserializer/SerializerDataTypes.h"
@@ -74,9 +74,9 @@
 
 	private:
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_UseMask> m_bUseMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_Mask> m_spaMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_Mask> m_spaMask;
 		serializer::TSharedModificationTracker<bool, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_UseExcludeMask> m_bUseExcludeMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_ExcludeMask> m_spaExcludeMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_ExcludeMask> m_spaExcludeMask;
 
 		serializer::TSharedModificationTracker<EFeedbackResult, Bitset, FeedbackNotEnoughSpaceRuleEnum::eMod_Result> m_eResult;
 	};
Index: src/libchengine/FeedbackOperationEventRule.h
===================================================================
diff -u -N -rf8b6de9c28b2957db0b4e71efa11df8632e41261 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/FeedbackOperationEventRule.h	(.../FeedbackOperationEventRule.h)	(revision f8b6de9c28b2957db0b4e71efa11df8632e41261)
+++ src/libchengine/FeedbackOperationEventRule.h	(.../FeedbackOperationEventRule.h)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -2,7 +2,7 @@
 
 #include "libchengine.h"
 #include "../libserializer/SerializableObject.h"
-#include "../libstring/TStringPatternArray.h"
+#include "../libchcore/TStringPatternArray.h"
 #include "ECompareType.h"
 #include "EFeedbackResult.h"
 #include "../libserializer/SerializerDataTypes.h"
Index: src/libchengine/TFileFilter.cpp
===================================================================
diff -u -N -rf8b6de9c28b2957db0b4e71efa11df8632e41261 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/TFileFilter.cpp	(.../TFileFilter.cpp)	(revision f8b6de9c28b2957db0b4e71efa11df8632e41261)
+++ src/libchengine/TFileFilter.cpp	(.../TFileFilter.cpp)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -1,21 +1,21 @@
-/***************************************************************************
-*   Copyright (C) 2001-2008 by Jozef Starosczyk                           *
-*   ixen@copyhandler.com                                                  *
-*                                                                         *
-*   This program is free software; you can redistribute it and/or modify  *
-*   it under the terms of the GNU Library General Public License          *
-*   (version 2) as published by the Free Software Foundation;             *
-*                                                                         *
-*   This program is distributed in the hope that it will be useful,       *
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
-*   GNU General Public License for more details.                          *
-*                                                                         *
-*   You should have received a copy of the GNU Library General Public     *
-*   License along with this program; if not, write to the                 *
-*   Free Software Foundation, Inc.,                                       *
-*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
-***************************************************************************/
+// ============================================================================
+//  Copyright (C) 2001-2020 by Jozef Starosczyk
+//  ixen {at} copyhandler [dot] com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
 #include "stdafx.h"
 #include "TFileFilter.h"
 #include "TFileInfo.h"
Index: src/libchengine/TFileFilter.h
===================================================================
diff -u -N -rf8b6de9c28b2957db0b4e71efa11df8632e41261 -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libchengine/TFileFilter.h	(.../TFileFilter.h)	(revision f8b6de9c28b2957db0b4e71efa11df8632e41261)
+++ src/libchengine/TFileFilter.h	(.../TFileFilter.h)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -1,28 +1,27 @@
-/***************************************************************************
- *   Copyright (C) 2001-2008 by Jozef Starosczyk                           *
- *   ixen@copyhandler.com                                                  *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU Library General Public License          *
- *   (version 2) as published by the Free Software Foundation;             *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU Library General Public     *
- *   License along with this program; if not, write to the                 *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
-#ifndef __TFILEFILTER_H__
-#define __TFILEFILTER_H__
+// ============================================================================
+//  Copyright (C) 2001-2020 by Jozef Starosczyk
+//  ixen {at} copyhandler [dot] com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
+#pragma once
 
 #include <atltime.h>
 #include "TDateTime.h"
 #include <bitset>
-#include "../libstring/TStringPatternArray.h"
+#include "../libchcore/TStringPatternArray.h"
 #include "../libserializer/TSharedModificationTracker.h"
 #include "ECompareType.h"
 #include "../libserializer/SerializableObject.h"
@@ -199,11 +198,11 @@
 
 		// files mask
 		serializer::TSharedModificationTracker<bool, Bitset, FileFilterEnum::eMod_UseMask> m_bUseMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FileFilterEnum::eMod_Mask> m_astrMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FileFilterEnum::eMod_Mask> m_astrMask;
 
 		// files mask-
 		serializer::TSharedModificationTracker<bool, Bitset, FileFilterEnum::eMod_UseExcludeMask> m_bUseExcludeMask;
-		serializer::TSharedModificationTracker<string::TStringPatternArray, Bitset, FileFilterEnum::eMod_ExcludeMask> m_astrExcludeMask;
+		serializer::TSharedModificationTracker<chcore::TStringPatternArray, Bitset, FileFilterEnum::eMod_ExcludeMask> m_astrExcludeMask;
 
 		// size filtering
 		serializer::TSharedModificationTracker<bool, Bitset, FileFilterEnum::eMod_UseSize1> m_bUseSize1;
@@ -241,5 +240,3 @@
 	};
 #pragma warning(pop)
 }
-
-#endif
Index: src/libstring/libstring.vcxproj
===================================================================
diff -u -N -r2dea2d82eb5c11d9e92d42e47f876e58c4505c4b -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libstring/libstring.vcxproj	(.../libstring.vcxproj)	(revision 2dea2d82eb5c11d9e92d42e47f876e58c4505c4b)
+++ src/libstring/libstring.vcxproj	(.../libstring.vcxproj)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -501,8 +501,6 @@
   <ItemGroup>
     <ClInclude Include="resource.h" />
     <ClInclude Include="TStringException.h" />
-    <ClInclude Include="TStringPattern.h" />
-    <ClInclude Include="TStringPatternArray.h" />
     <ClInclude Include="TString.h" />
     <ClInclude Include="TStringArray.h" />
     <ClInclude Include="TStringSet.h" />
@@ -536,27 +534,13 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
-    <ClCompile Include="Tests\TestsTStringPattern.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="Tests\TestsTStringPatternArray.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
     <ClCompile Include="Tests\TestsTStringSet.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
     <ClCompile Include="TStringException.cpp" />
-    <ClCompile Include="TStringPattern.cpp" />
-    <ClCompile Include="TStringPatternArray.cpp" />
     <ClCompile Include="TString.cpp" />
     <ClCompile Include="TStringArray.cpp" />
     <ClCompile Include="TStringSet.cpp" />
Index: src/libstring/libstring.vcxproj.filters
===================================================================
diff -u -N -rfadd6c9c628de875716d96c3a497b5bc6c8dca8a -r22c7d5559ca17c9b1859d2283b667516b23ac597
--- src/libstring/libstring.vcxproj.filters	(.../libstring.vcxproj.filters)	(revision fadd6c9c628de875716d96c3a497b5bc6c8dca8a)
+++ src/libstring/libstring.vcxproj.filters	(.../libstring.vcxproj.filters)	(revision 22c7d5559ca17c9b1859d2283b667516b23ac597)
@@ -38,12 +38,6 @@
     <ClInclude Include="TStringException.h">
       <Filter>Source Files\Tools</Filter>
     </ClInclude>
-    <ClInclude Include="TStringPattern.h">
-      <Filter>Source Files\Tools</Filter>
-    </ClInclude>
-    <ClInclude Include="TStringPatternArray.h">
-      <Filter>Source Files\Tools</Filter>
-    </ClInclude>
     <ClInclude Include="resource.h" />
   </ItemGroup>
   <ItemGroup>
@@ -71,18 +65,6 @@
     <ClCompile Include="..\..\tests\tests_shared\TestsExports.cpp">
       <Filter>Tests</Filter>
     </ClCompile>
-    <ClCompile Include="TStringPattern.cpp">
-      <Filter>Source Files\Tools</Filter>
-    </ClCompile>
-    <ClCompile Include="TStringPatternArray.cpp">
-      <Filter>Source Files\Tools</Filter>
-    </ClCompile>
-    <ClCompile Include="Tests\TestsTStringPatternArray.cpp">
-      <Filter>Tests</Filter>
-    </ClCompile>
-    <ClCompile Include="Tests\TestsTStringPattern.cpp">
-      <Filter>Tests</Filter>
-    </ClCompile>
     <ClCompile Include="Tests\TestsTStringSet.cpp">
       <Filter>Tests</Filter>
     </ClCompile>