template<class T, class I>
bool __startsWith(const std::basic_string<T> &str, const std::basic_string<T> &prefix, bool ignoreCase, I(*fnToLower)(I))
{
return prefix.size() <= str.size() &&
(!ignoreCase ? std::equal(prefix.cbegin(), prefix.cend(), str.cbegin())
: std::equal(prefix.cbegin(), prefix.cend(), str.cbegin(), [&fnToLower](T a, T b)
{
return fnToLower((I)a) == fnToLower((I)b);
}));
}
bool startsWith(const std::string &str, const std::string &prefix, bool ignoreCase)
{
return __startsWith(str, prefix, ignoreCase, ::tolower);
}
bool startsWith(const std::wstring &str, const std::wstring &prefix, bool ignoreCase)
{
return __startsWith(str, prefix, ignoreCase, ::towlower);
}
template<class T, class I>
bool __endsWith(const std::basic_string<T> &str, const std::basic_string<T> &suffix, bool ignoreCase, I(*fnToLower)(I))
{
return suffix.size() <= str.size() &&
(!ignoreCase ? std::equal(suffix.crbegin(), suffix.crend(), str.crbegin())
: std::equal(suffix.crbegin(), suffix.crend(), str.crbegin(), [&fnToLower](T a, T b)
{
return fnToLower(a) == fnToLower(b);
}));
}
bool endsWith(const std::string &str, const std::string &suffix, bool ignoreCase)
{
return __endsWith(str, suffix, ignoreCase, ::tolower);
}
bool endsWith(const std::wstring &str, const std::wstring &suffix, bool ignoreCase)
{
return __endsWith(str, suffix, ignoreCase, ::towlower);
}
template<class T, class I>
bool __equals(const std::basic_string<T> &str1, const std::basic_string<T> &str2, bool ignoreCase, I(*fnToLower)(I))
{
if (str1.size() != str2.size())
{
return false;
}
return (!ignoreCase ? std::equal(str1.cbegin(), str1.cend(), str2.cbegin())
: std::equal(str1.cbegin(), str1.cend(), str2.cbegin(), [&fnToLower](T a, T b)
{
return fnToLower(a) == fnToLower(b);
}));
}
bool equals(const std::string &str1, const std::string &str2, bool ignoreCase)
{
return __equals(str1, str2, ignoreCase, ::tolower);
}
bool equals(const std::wstring &str1, const std::wstring &str2, bool ignoreCase)
{
return __equals(str1, str2, ignoreCase, ::towlower);
}
template<class T>
std::vector<std::basic_string<T>> __split(const std::basic_string<T> &str, const std::basic_string<T> &delimiter)
{
std::vector<std::basic_string<T>>result;
size_t pos = 0;
while (pos != std::basic_string<T>::npos)
{
size_t index = str.find(delimiter, pos);
if (index != std::basic_string<T>::npos)
{
result.push_back(str.substr(pos, index - pos));
pos = index + delimiter.size();
}
else
{
result.push_back(str.substr(pos));
pos = index;
}
}
return result;
}
std::vector<std::string> split(const std::string &str, const std::string &delimiter)
{
return __split(str, delimiter);
}
std::vector<std::wstring> split(const std::wstring &str, const std::wstring &delimiter)
{
return __split(str, delimiter);
}
Post Views: 16