diff options
Diffstat (limited to 'src/util/string.h')
-rw-r--r-- | src/util/string.h | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/src/util/string.h b/src/util/string.h index df20e34ae9..9b4c9a7e28 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -7,7 +7,6 @@ #include <util/spanparsing.h> -#include <algorithm> #include <array> #include <cstdint> #include <cstring> @@ -17,7 +16,7 @@ #include <string_view> #include <vector> -void ReplaceAll(std::string& in_out, std::string_view search, std::string_view substitute); +void ReplaceAll(std::string& in_out, const std::string& search, const std::string& substitute); [[nodiscard]] inline std::vector<std::string> SplitString(std::string_view str, char sep) { @@ -58,34 +57,30 @@ void ReplaceAll(std::string& in_out, std::string_view search, std::string_view s } /** - * 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; }); } /** |