Make Join() util work with any container type

Also, remove helper that is only used in tests.
This commit is contained in:
MacroFake 2022-08-19 19:28:22 +02:00
parent faf8da3c8d
commit fa1c716955
No known key found for this signature in database
GPG key ID: CE2B75697E69A548
2 changed files with 19 additions and 16 deletions

View file

@ -244,9 +244,9 @@ BOOST_AUTO_TEST_CASE(util_Join)
// Version with unary operator // Version with unary operator
const auto op_upper = [](const std::string& s) { return ToUpper(s); }; const auto op_upper = [](const std::string& s) { return ToUpper(s); };
BOOST_CHECK_EQUAL(Join<std::string>({}, ", ", op_upper), ""); BOOST_CHECK_EQUAL(Join(std::list<std::string>{}, ", ", op_upper), "");
BOOST_CHECK_EQUAL(Join<std::string>({"foo"}, ", ", op_upper), "FOO"); BOOST_CHECK_EQUAL(Join(std::list<std::string>{"foo"}, ", ", op_upper), "FOO");
BOOST_CHECK_EQUAL(Join<std::string>({"foo", "bar"}, ", ", op_upper), "FOO, BAR"); BOOST_CHECK_EQUAL(Join(std::list<std::string>{"foo", "bar"}, ", ", op_upper), "FOO, BAR");
} }
BOOST_AUTO_TEST_CASE(util_ReplaceAll) BOOST_AUTO_TEST_CASE(util_ReplaceAll)

View file

@ -58,27 +58,30 @@ void ReplaceAll(std::string& in_out, const std::string& search, const std::strin
} }
/** /**
* Join a list of items * Join all container items. Typically used to concatenate strings but accepts
* containers with elements of any type.
* *
* @param list The list to join * @param container The items to join
* @param separator The separator * @param separator The separator
* @param unary_op Apply this operator to each item in the list * @param unary_op Apply this operator to each item
*/ */
template <typename T, typename BaseType, typename UnaryOp> template <typename C, typename S, typename UnaryOp>
auto Join(const std::vector<T>& list, const BaseType& separator, UnaryOp unary_op) auto Join(const C& container, const S& separator, UnaryOp unary_op)
{ {
decltype(unary_op(list.at(0))) ret; decltype(unary_op(*container.begin())) ret;
for (size_t i = 0; i < list.size(); ++i) { bool first{true};
if (i > 0) ret += separator; for (const auto& item : container) {
ret += unary_op(list.at(i)); if (!first) ret += separator;
ret += unary_op(item);
first = false;
} }
return ret; return ret;
} }
template <typename T, typename T2> template <typename C, typename S>
T Join(const std::vector<T>& list, const T2& separator) auto Join(const C& container, const S& separator)
{ {
return Join(list, separator, [](const T& i) { return i; }); return Join(container, separator, [](const auto& i) { return i; });
} }
/** /**