Merge c89fabff3d into merged_master (Bitcoin PR bitcoin/bitcoin#25879)

This commit is contained in:
Byron Hambly 2024-11-21 14:58:19 +02:00
commit 29d37bc8e6
3 changed files with 24 additions and 40 deletions

View file

@ -59,34 +59,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 separator The separator
* @param unary_op Apply this operator to each item in the list
* @param container The items to join
* @param separator The separator
* @param unary_op Apply this operator to each item
*/
template <typename T, typename BaseType, typename UnaryOp>
auto Join(const std::vector<T>& list, const BaseType& separator, UnaryOp unary_op)
-> decltype(unary_op(list.at(0)))
template <typename C, typename S, typename UnaryOp>
auto Join(const C& container, const S& separator, UnaryOp unary_op)
{
decltype(unary_op(list.at(0))) ret;
for (size_t i = 0; i < list.size(); ++i) {
if (i > 0) ret += separator;
ret += unary_op(list.at(i));
decltype(unary_op(*container.begin())) ret;
bool first{true};
for (const auto& item : container) {
if (!first) ret += separator;
ret += unary_op(item);
first = false;
}
return ret;
}
template <typename T, typename T2>
T Join(const std::vector<T>& list, const T2& separator)
template <typename C, typename S>
auto Join(const C& container, const S& separator)
{
return Join(list, separator, [](const T& i) { return i; });
}
// Explicit overload needed for c_str arguments, which would otherwise cause a substitution failure in the template above.
inline std::string Join(const std::vector<std::string>& list, std::string_view separator)
{
return Join<std::string>(list, separator);
return Join(container, separator, [](const auto& i) { return i; });
}
/**