Skip to content

Commit

Permalink
Vutils
Browse files Browse the repository at this point in the history
  • Loading branch information
vic4key committed Oct 3, 2023
1 parent 17f84e4 commit 12d1cc9
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Test/Sample.String.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,9 @@ DEF_SAMPLE(String)
}
}

std::vector<std::tstring> strings = { ts("ape"), ts("apple"), ts("peach"), ts("puppy") };
auto closest_string = vu::find_closest_string(ts("aple"), strings);
assert(closest_string == ts("apple"));

return vu::VU_OK;
}
6 changes: 6 additions & 0 deletions include/Vutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,10 @@ std::wstring vuapi regex_replace_string_W(
const std::wregex& pattern,
const std::wstring& replacement,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
std::string vuapi find_closest_string_A(
const std::string& string, const std::vector<std::string>& string_list);
std::wstring vuapi find_closest_string_W(
const std::wstring& string, const std::vector<std::wstring>& string_list);

/**
* Process Working
Expand Down Expand Up @@ -764,6 +768,7 @@ void vuapi crypt_sha_buffer(
#define contains_string contains_string_W
#define compare_string compare_string_W
#define regex_replace_string regex_replace_string_W
#define find_closest_string find_closest_string_W
/* Window Working */
#define get_font get_font_W
#define get_monitors get_monitors_W
Expand Down Expand Up @@ -837,6 +842,7 @@ void vuapi crypt_sha_buffer(
#define contains_string contains_string_A
#define compare_string compare_string_A
#define regex_replace_string regex_replace_string_A
#define find_closest_string find_closest_string_A
/* Window Working */
#define get_font get_font_A
#define get_monitors get_monitors_A
Expand Down
65 changes: 65 additions & 0 deletions src/details/string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,71 @@ std::wstring vuapi regex_replace_string_W(
return result;
}

template<class StringT>
StringT vuapi find_closest_string_T(const StringT& string, const std::vector<StringT>& string_list)
{
if (string_list.empty())
{
return StringT();
}

auto fn_find_max_common_sub_string_length = [&](const StringT& a, const StringT& b) -> size_t
{
size_t result = 0;

size_t n = a.length();
size_t m = b.length();
std::vector<std::vector<size_t>> length_table(n + 1, std::vector<size_t>(m + 1, 0));

for (size_t i = 1; i <= n; i++)
{
for (size_t j = 1; j <= m; j++)
{
if (a[i - 1] == b[j - 1])
{
length_table[i][j] = length_table[i - 1][j - 1] + 1;
if (length_table[i][j] > result)
{
result = length_table[i][j];
}
}
else
{
length_table[i][j] = 0;
}
}
}

return result;
};

size_t max_val = 0;
size_t max_idx = 0;
for (size_t i = 0; i < string_list.size(); ++i)
{
size_t const dist = fn_find_max_common_sub_string_length(string_list[i], string);
if (dist > max_val)
{
max_val = dist;
max_idx = i;
}
}

return max_idx >= 0 ? string_list[max_idx] : string_list[0];
}

std::string vuapi find_closest_string_A(
const std::string& string, const std::vector<std::string>& string_list)
{
return find_closest_string_T<std::string>(string, string_list);
}

std::wstring vuapi find_closest_string_W(
const std::wstring& string, const std::vector<std::wstring>& string_list)
{
return find_closest_string_T<std::wstring>(string, string_list);
}

#ifdef _MSC_VER
#pragma warning(pop)
#endif // _MSC_VER
Expand Down

0 comments on commit 12d1cc9

Please sign in to comment.