Bitcoin ABC 0.32.12
P2P Digital Currency
string.h
Go to the documentation of this file.
1// Copyright (c) 2019 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 <span.h>
9
10#include <array>
11#include <cstdint>
12#include <cstring>
13#include <locale>
14#include <sstream>
15#include <string>
16#include <string_view>
17#include <vector>
18
19namespace util {
20void ReplaceAll(std::string &in_out, const std::string &search,
21 const std::string &substitute);
22
31template <typename T = Span<const char>>
32std::vector<T> Split(const Span<const char> &sp, std::string_view separators) {
33 std::vector<T> ret;
34 auto it = sp.begin();
35 auto start = it;
36 while (it != sp.end()) {
37 if (separators.find(*it) != std::string::npos) {
38 ret.emplace_back(start, it);
39 start = it + 1;
40 }
41 ++it;
42 }
43 ret.emplace_back(start, it);
44 return ret;
45}
46
54template <typename T = Span<const char>>
55std::vector<T> Split(const Span<const char> &sp, char sep) {
56 return Split<T>(sp, std::string_view{&sep, 1});
57}
58
59[[nodiscard]] inline std::vector<std::string> SplitString(std::string_view str,
60 char sep) {
61 return Split<std::string>(str, sep);
62}
63
64[[nodiscard]] inline std::vector<std::string>
65SplitString(std::string_view str, std::string_view separators) {
66 return Split<std::string>(str, separators);
67}
68
69[[nodiscard]] inline std::string_view
70TrimStringView(std::string_view str, std::string_view pattern = " \f\n\r\t\v") {
71 std::string::size_type front = str.find_first_not_of(pattern);
72 if (front == std::string::npos) {
73 return {};
74 }
75 std::string::size_type end = str.find_last_not_of(pattern);
76 return str.substr(front, end - front + 1);
77}
78
79[[nodiscard]] inline std::string
80TrimString(std::string_view str, std::string_view pattern = " \f\n\r\t\v") {
81 return std::string(TrimStringView(str, pattern));
82}
83
84[[nodiscard]] inline std::string_view
85RemovePrefixView(std::string_view str, std::string_view prefix) {
86 if (str.substr(0, prefix.size()) == prefix) {
87 return str.substr(prefix.size());
88 }
89 return str;
90}
91
92[[nodiscard]] inline std::string RemovePrefix(std::string_view str,
93 std::string_view prefix) {
94 return std::string(RemovePrefixView(str, prefix));
95}
96
104template <typename T, typename BaseType, typename UnaryOp>
105auto Join(const std::vector<T> &list, const BaseType &separator,
106 UnaryOp unary_op) -> decltype(unary_op(list.at(0))) {
107 decltype(unary_op(list.at(0))) ret;
108 for (size_t i = 0; i < list.size(); ++i) {
109 if (i > 0) {
110 ret += separator;
111 }
112 ret += unary_op(list.at(i));
113 }
114 return ret;
115}
116
117template <typename T, typename T2>
118T Join(const std::vector<T> &list, const T2 &separator) {
119 return Join(list, separator, [](const T &i) { return i; });
120}
121
122// Explicit overload needed for c_str arguments, which would otherwise cause a
123// substitution failure in the template above.
124inline std::string Join(const std::vector<std::string> &list,
125 std::string_view separator) {
126 return Join<std::string>(list, separator);
127}
128
132inline std::string MakeUnorderedList(const std::vector<std::string> &items) {
133 return Join(items, "\n",
134 [](const std::string &item) { return "- " + item; });
135}
136
140[[nodiscard]] inline bool ContainsNoNUL(std::string_view str) noexcept {
141 for (auto c : str) {
142 if (c == 0) return false;
143 }
144 return true;
145}
146
150template <typename T> std::string ToString(const T &t) {
151 std::ostringstream oss;
152 oss.imbue(std::locale::classic());
153 oss << t;
154 return oss.str();
155}
156
160template <typename T1, size_t PREFIX_LEN>
161[[nodiscard]] inline bool
162HasPrefix(const T1 &obj, const std::array<uint8_t, PREFIX_LEN> &prefix) {
163 return obj.size() >= PREFIX_LEN &&
164 std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
165}
166} // namespace util
167
168#endif // BITCOIN_UTIL_STRING_H
A Span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:94
constexpr C * begin() const noexcept
Definition: span.h:200
constexpr C * end() const noexcept
Definition: span.h:201
std::vector< std::string > SplitString(std::string_view str, char sep)
Definition: string.h:59
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:162
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:105
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
Definition: string.h:70
std::string MakeUnorderedList(const std::vector< std::string > &items)
Create an unordered multi-line list of items.
Definition: string.h:132
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
Definition: string.h:85
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:150
std::string TrimString(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
Definition: string.h:80
std::string RemovePrefix(std::string_view str, std::string_view prefix)
Definition: string.h:92
bool ContainsNoNUL(std::string_view str) noexcept
Check if a string does not contain any embedded NUL (\0) characters.
Definition: string.h:140
std::vector< T > Split(const Span< const char > &sp, std::string_view separators)
Split a string on any char found in separators, returning a vector.
Definition: string.h:32
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
Definition: string.cpp:11
const char * prefix
Definition: rest.cpp:813