5 #ifndef BITCOIN_UTIL_STRING_H
6 #define BITCOIN_UTIL_STRING_H
18 NODISCARD inline std::string
TrimString(
const std::string& str,
const std::string& pattern =
" \f\n\r\t\v")
20 std::string::size_type front = str.find_first_not_of(pattern);
21 if (front == std::string::npos) {
24 std::string::size_type end = str.find_last_not_of(pattern);
25 return str.substr(front, end - front + 1);
35 template <
typename T,
typename BaseType,
typename UnaryOp>
36 auto Join(
const std::vector<T>& list,
const BaseType& separator, UnaryOp unary_op)
37 -> decltype(unary_op(list.at(0)))
39 decltype(unary_op(list.at(0))) ret;
40 for (
size_t i = 0; i < list.size(); ++i) {
41 if (i > 0) ret += separator;
42 ret += unary_op(list.at(i));
48 T
Join(
const std::vector<T>& list,
const T& separator)
50 return Join(list, separator, [](
const T& i) {
return i; });
54 inline std::string
Join(
const std::vector<std::string>& list,
const std::string& separator)
56 return Join<std::string>(list, separator);
64 return str.size() == strlen(str.c_str());
73 std::ostringstream oss;
74 oss.imbue(std::locale::classic());
82 template <
typename T1,
size_t PREFIX_LEN>
84 const std::array<uint8_t, PREFIX_LEN>&
prefix)
86 return obj.size() >= PREFIX_LEN &&
87 std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
90 #endif // BITCOIN_UTIL_STRENCODINGS_H
auto Join(const std::vector< T > &list, const BaseType &separator, UnaryOp unary_op) -> decltype(unary_op(list.at(0)))
Join a list of items.
NODISCARD bool ValidAsCString(const std::string &str) noexcept
Check if a string does not contain any embedded NUL (\0) characters.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
NODISCARD std::string TrimString(const std::string &str, const std::string &pattern=" \f\n\r\t\v")
NODISCARD bool HasPrefix(const T1 &obj, const std::array< uint8_t, PREFIX_LEN > &prefix)
Check whether a container begins with the given prefix.