added helper function that joins vectors of strings, refactored suggestions formattingi function to use it

This commit is contained in:
Evgeniy Filatov 2018-08-02 17:57:16 +03:00
parent 009a55c82d
commit 3705bcc9bc
3 changed files with 61 additions and 10 deletions

View File

@ -85,17 +85,11 @@ size_t dev::stringDistance(string const& _str1, string const& _str2)
string dev::quotedAlternativesList(vector<string> const& suggestions)
{
if (suggestions.empty())
return "";
if (suggestions.size() == 1)
return "\"" + suggestions.front() + "\"";
vector<string> quotedSuggestions;
string choices = "\"" + suggestions.front() + "\"";
for (size_t i = 1; i + 1 < suggestions.size(); ++i)
choices += ", \"" + suggestions[i] + "\"";
for (auto& suggestion: suggestions)
quotedSuggestions.push_back("\"" + suggestion + "\"");
choices += " or \"" + suggestions.back() + "\"";
return choices;
return joinHumanReadable(quotedSuggestions, ", ", " or ");
}

View File

@ -36,4 +36,43 @@ size_t stringDistance(std::string const& _str1, std::string const& _str2);
// Return a string having elements of suggestions as quoted, alternative suggestions. e.g. "a", "b" or "c"
std::string quotedAlternativesList(std::vector<std::string> const& suggestions);
/// Joins collection of strings into one string with separators between, last separator can be different.
/// @param _list collection of strings to join
/// @param _separator defaults to ", "
/// @param _lastSeparator (optional) will be used to separate last two strings instead of _separator
/// @example join(vector<string>{"a", "b", "c"}, "; ", " or ") == "a; b or c"
template<class T>
std::string joinHumanReadable
(
T const& _list,
std::string const& _separator = ", ",
std::string const& _lastSeparator = ""
)
{
auto it = begin(_list);
auto itEnd = end(_list);
std::string result;
// append first string
if (it != itEnd)
{
result += *it;
++it;
}
for (;it != itEnd; ++it)
{
if ((next(it) == itEnd) && !_lastSeparator.empty())
result += _lastSeparator; // last iteration
else
result += _separator;
// append string
result += *it;
}
return result;
}
}

View File

@ -81,6 +81,24 @@ BOOST_AUTO_TEST_CASE(test_alternatives_list)
BOOST_CHECK_EQUAL(quotedAlternativesList(strings), "\"a\", \"b\", \"c\" or \"d\"");
}
BOOST_AUTO_TEST_CASE(test_human_readable_join)
{
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({})), "");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a"})), "a");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a", "b"})), "a, b");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a", "b", "c"})), "a, b, c");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({}), "; "), "");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a"}), "; "), "a");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a", "b"}), "; "), "a; b");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a", "b", "c"}), "; "), "a; b; c");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({}), "; ", " or "), "");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a"}), "; ", " or "), "a");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a", "b"}), "; ", " or "), "a or b");
BOOST_CHECK_EQUAL(joinHumanReadable(vector<string>({"a", "b", "c"}), "; ", " or "), "a; b or c");
}
BOOST_AUTO_TEST_SUITE_END()