Bitcoin Core  0.20.99
P2P Digital Currency
string.h
Go to the documentation of this file.
1 // Copyright (c) 2019-2020 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_UTIL_STRING_H
6 #define BITCOIN_UTIL_STRING_H
7 
8 #include <attributes.h>
9 
10 #include <algorithm>
11 #include <array>
12 #include <cstring>
13 #include <locale>
14 #include <sstream>
15 #include <string>
16 #include <vector>
17 
18 NODISCARD inline std::string TrimString(const std::string& str, const std::string& pattern = " \f\n\r\t\v")
19 {
20  std::string::size_type front = str.find_first_not_of(pattern);
21  if (front == std::string::npos) {
22  return std::string();
23  }
24  std::string::size_type end = str.find_last_not_of(pattern);
25  return str.substr(front, end - front + 1);
26 }
27 
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)))
38 {
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));
43  }
44  return ret;
45 }
46 
47 template <typename T>
48 T Join(const std::vector<T>& list, const T& separator)
49 {
50  return Join(list, separator, [](const T& i) { return i; });
51 }
52 
53 // Explicit overload needed for c_str arguments, which would otherwise cause a substitution failure in the template above.
54 inline std::string Join(const std::vector<std::string>& list, const std::string& separator)
55 {
56  return Join<std::string>(list, separator);
57 }
58 
62 NODISCARD inline bool ValidAsCString(const std::string& str) noexcept
63 {
64  return str.size() == strlen(str.c_str());
65 }
66 
70 template <typename T>
71 std::string ToString(const T& t)
72 {
73  std::ostringstream oss;
74  oss.imbue(std::locale::classic());
75  oss << t;
76  return oss.str();
77 }
78 
82 template <typename T1, size_t PREFIX_LEN>
83 NODISCARD inline bool HasPrefix(const T1& obj,
84  const std::array<uint8_t, PREFIX_LEN>& prefix)
85 {
86  return obj.size() >= PREFIX_LEN &&
87  std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
88 }
89 
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.
Definition: string.h:36
NODISCARD bool ValidAsCString(const std::string &str) noexcept
Check if a string does not contain any embedded NUL (\0) characters.
Definition: string.h:62
const char * prefix
Definition: rest.cpp:670
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:71
NODISCARD std::string TrimString(const std::string &str, const std::string &pattern=" \\\)
Definition: string.h:18
#define NODISCARD
Definition: attributes.h:18
NODISCARD bool HasPrefix(const T1 &obj, const std::array< uint8_t, PREFIX_LEN > &prefix)
Check whether a container begins with the given prefix.
Definition: string.h:83