xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
include
xrpl
basics
StringUtilities.h
1
#pragma once
2
3
#include <xrpl/basics/Blob.h>
4
5
#include <boost/utility/string_view.hpp>
6
7
#include <
array
>
8
#include <
concepts
>
9
#include <
cstddef
>
10
#include <
cstdint
>
11
#include <
optional
>
12
#include <
string
>
13
#include <
string_view
>
14
#include <
type_traits
>
15
#include <
utility
>
16
17
namespace
xrpl
{
18
30
std::string
31
sqlBlobLiteral
(
Blob
const
& blob);
32
33
namespace
detail
{
34
35
template
<
typename
T>
36
concept
SomeChar
= std::same_as<std::remove_cvref_t<T>, int8_t> ||
37
std::same_as<std::remove_cvref_t<T>,
char
> || std::same_as<std::remove_cvref_t<T>, uint8_t>;
38
39
inline
constexpr
std::array<std::optional<int>
, 256>
const
kDigitLookupTable
= []() {
40
std::array<std::optional<int>
, 256> t{};
41
42
for
(
int
i = 0; i < 10; ++i)
43
t[
'0'
+ i] = i;
44
45
for
(
int
i = 0; i < 6; ++i)
46
{
47
t[
'A'
+ i] = 10 + i;
48
t[
'a'
+ i] = 10 + i;
49
}
50
51
return
t;
52
}();
53
54
inline
std::optional<int>
55
hexCharToInt
(
SomeChar
auto
hexChar)
56
{
57
return
kDigitLookupTable
[
static_cast<
uint8_t
>
(hexChar)];
58
}
59
60
}
// namespace detail
61
62
template
<
class
Iterator>
63
std::optional<Blob>
64
strUnHex
(
std::size_t
strSize, Iterator begin, Iterator end)
65
{
66
Blob
out;
67
68
out.
reserve
((strSize + 1) / 2);
69
70
auto
iter = begin;
71
72
if
(strSize & 1)
73
{
74
auto
const
c =
detail::hexCharToInt
(*iter++);
75
if
(!c.has_value())
76
return
{};
77
78
out.
push_back
(
static_cast<
unsigned
char
>
(*c));
79
}
80
81
while
(iter != end)
82
{
83
auto
const
cHigh =
detail::hexCharToInt
(*iter++);
84
85
if
(!cHigh.has_value())
86
return
{};
87
88
auto
const
cLow =
detail::hexCharToInt
(*iter++);
89
90
if
(!cLow.has_value())
91
return
{};
92
93
out.
push_back
(
static_cast<
unsigned
char
>
((*cHigh << 4) | *cLow));
94
}
95
96
return
{std::move(out)};
97
}
98
99
inline
std::optional<Blob>
100
strUnHex
(
std::string_view
strSrc)
101
{
102
return
strUnHex
(strSrc.
size
(), strSrc.
cbegin
(), strSrc.
cend
());
103
}
104
105
struct
ParsedUrl
106
{
107
explicit
ParsedUrl
() =
default
;
108
109
std::string
scheme
;
110
std::string
username
;
111
std::string
password
;
112
std::string
domain
;
113
std::optional<std::uint16_t>
port
;
114
std::string
path
;
115
116
bool
117
operator==
(
ParsedUrl
const
& other)
const
118
{
119
return
scheme
== other.
scheme
&&
domain
== other.
domain
&&
port
== other.
port
&&
120
path
== other.
path
;
121
}
122
};
123
124
bool
125
parseUrl
(ParsedUrl& pUrl,
std::string
const
& strUrl);
126
136
std::string
137
trimWhitespace
(
std::string
str);
138
149
std::string
150
toLower
(
std::string
str);
151
152
std::optional<std::uint64_t>
153
toUInt64
(
std::string
const
& s);
154
162
bool
163
isProperlyFormedTomlDomain
(
std::string_view
domain);
164
180
consteval
bool
181
isNullTerminated
(
std::string_view
str)
182
{
183
if
(str.
data
() ==
nullptr
)
184
return
false
;
185
186
// Reading past the view is the point, so the usual data() warning does not
187
// apply.
188
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
189
return
std::string_view
{str.
data
()} == str;
190
}
191
202
class
NullTerminatedView
203
{
204
public
:
214
explicit
consteval
NullTerminatedView
(
std::string_view
view
)
215
:
data_
(
view
.data()),
size_
(
view
.size())
216
{
217
if
(!
isNullTerminated
(
view
))
218
throw
"xrpl::NullTerminatedView : view does not reach a null"
;
219
}
220
221
constexpr
222
operator
std::string_view
() const noexcept
223
{
224
return
view
();
225
}
226
230
[[nodiscard]]
constexpr
std::string_view
231
view
() const noexcept
232
{
233
return
{
data_
,
size_
};
234
}
235
239
[[nodiscard]]
constexpr
char
const
*
240
asCString
() const noexcept
241
{
242
return
data_
;
243
}
244
245
private
:
246
char
const
*
data_
;
247
std::size_t
size_
;
248
};
249
250
}
// namespace xrpl
array
std::string
std::string_view
std::string_view::cbegin
T cbegin(T... args)
xrpl::NullTerminatedView::size_
std::size_t size_
Definition
StringUtilities.h:247
xrpl::NullTerminatedView::view
constexpr std::string_view view() const noexcept
Definition
StringUtilities.h:231
xrpl::NullTerminatedView::asCString
constexpr char const * asCString() const noexcept
Definition
StringUtilities.h:240
xrpl::NullTerminatedView::data_
char const * data_
Definition
StringUtilities.h:246
xrpl::NullTerminatedView::NullTerminatedView
consteval NullTerminatedView(std::string_view view)
Build a view from one that reaches its terminating null.
Definition
StringUtilities.h:214
concepts
xrpl::detail::SomeChar
Definition
StringUtilities.h:36
cstddef
cstdint
std::string_view::data
T data(T... args)
std::string_view::cend
T cend(T... args)
xrpl::detail
Definition
base_uint.h:37
xrpl::detail::hexCharToInt
std::optional< int > hexCharToInt(SomeChar auto hexChar)
Definition
StringUtilities.h:55
xrpl::detail::kDigitLookupTable
constexpr std::array< std::optional< int >, 256 > const kDigitLookupTable
Definition
StringUtilities.h:39
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::toLower
std::string toLower(std::string str)
Fold ASCII upper case letters to lower case.
Definition
libxrpl/basics/StringUtilities.cpp:129
xrpl::isProperlyFormedTomlDomain
bool isProperlyFormedTomlDomain(std::string_view domain)
Determines if the given string looks like a TOML-file hosting domain.
Definition
libxrpl/basics/StringUtilities.cpp:145
xrpl::isNullTerminated
consteval bool isNullTerminated(std::string_view str)
Whether a view can be passed on as a C string.
Definition
StringUtilities.h:181
xrpl::trimWhitespace
std::string trimWhitespace(std::string str)
Remove leading and trailing ASCII whitespace.
Definition
libxrpl/basics/StringUtilities.cpp:119
xrpl::strUnHex
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
Definition
StringUtilities.h:64
xrpl::toUInt64
std::optional< std::uint64_t > toUInt64(std::string const &s)
Definition
libxrpl/basics/StringUtilities.cpp:136
xrpl::sqlBlobLiteral
std::string sqlBlobLiteral(Blob const &blob)
Format arbitrary binary data as an SQLite "blob literal".
Definition
libxrpl/basics/StringUtilities.cpp:23
xrpl::Blob
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition
Blob.h:11
xrpl::parseUrl
bool parseUrl(ParsedUrl &pUrl, std::string const &strUrl)
Definition
libxrpl/basics/StringUtilities.cpp:37
optional
std::vector::push_back
T push_back(T... args)
std::vector::reserve
T reserve(T... args)
std::string_view::size
T size(T... args)
std::size_t
string
string_view
xrpl::ParsedUrl::operator==
bool operator==(ParsedUrl const &other) const
Definition
StringUtilities.h:117
xrpl::ParsedUrl::ParsedUrl
ParsedUrl()=default
xrpl::ParsedUrl::port
std::optional< std::uint16_t > port
Definition
StringUtilities.h:113
xrpl::ParsedUrl::password
std::string password
Definition
StringUtilities.h:111
xrpl::ParsedUrl::scheme
std::string scheme
Definition
StringUtilities.h:109
xrpl::ParsedUrl::domain
std::string domain
Definition
StringUtilities.h:112
xrpl::ParsedUrl::path
std::string path
Definition
StringUtilities.h:114
xrpl::ParsedUrl::username
std::string username
Definition
StringUtilities.h:110
type_traits
utility
Generated by
1.17.0