Bitcoin Core 22.99.0
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
28[[nodiscard]] inline std::string RemovePrefix(const std::string& str, const std::string& prefix)
29{
30 if (str.substr(0, prefix.size()) == prefix) {
31 return str.substr(prefix.size());
32 }
33 return str;
34}
35
43template <typename T, typename BaseType, typename UnaryOp>
44auto Join(const std::vector<T>& list, const BaseType& separator, UnaryOp unary_op)
45 -> decltype(unary_op(list.at(0)))
46{
47 decltype(unary_op(list.at(0))) ret;
48 for (size_t i = 0; i < list.size(); ++i) {
49 if (i > 0) ret += separator;
50 ret += unary_op(list.at(i));
51 }
52 return ret;
53}
54
55template <typename T>
56T Join(const std::vector<T>& list, const T& separator)
57{
58 return Join(list, separator, [](const T& i) { return i; });
59}
60
61// Explicit overload needed for c_str arguments, which would otherwise cause a substitution failure in the template above.
62inline std::string Join(const std::vector<std::string>& list, const std::string& separator)
63{
64 return Join<std::string>(list, separator);
65}
66
70inline std::string MakeUnorderedList(const std::vector<std::string>& items)
71{
72 return Join(items, "\n", [](const std::string& item) { return "- " + item; });
73}
74
78[[nodiscard]] inline bool ValidAsCString(const std::string& str) noexcept
79{
80 return str.size() == strlen(str.c_str());
81}
82
86template <typename T>
87std::string ToString(const T& t)
88{
89 std::ostringstream oss;
90 oss.imbue(std::locale::classic());
91 oss << t;
92 return oss.str();
93}
94
98template <typename T1, size_t PREFIX_LEN>
99[[nodiscard]] inline bool HasPrefix(const T1& obj,
100 const std::array<uint8_t, PREFIX_LEN>& prefix)
101{
102 return obj.size() >= PREFIX_LEN &&
103 std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
104}
105
106#endif // BITCOIN_UTIL_STRENCODINGS_H
#define T(expected, seed, data)
const char * prefix
Definition: rest.cpp:714
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:44
bool ValidAsCString(const std::string &str) noexcept
Check if a string does not contain any embedded NUL (\0) characters.
Definition: string.h:78
std::string RemovePrefix(const std::string &str, const std::string &prefix)
Definition: string.h:28
std::string MakeUnorderedList(const std::vector< std::string > &items)
Create an unordered multi-line list of items.
Definition: string.h:70
std::string TrimString(const std::string &str, const std::string &pattern=" \f\n\r\t\v")
Definition: string.h:18
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:87
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:99