/root/bitcoin/src/util/strencodings.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2009-2010 Satoshi Nakamoto |
2 | | // Copyright (c) 2009-2022 The Bitcoin Core developers |
3 | | // Distributed under the MIT software license, see the accompanying |
4 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
5 | | |
6 | | /** |
7 | | * Utilities for converting data from/to strings. |
8 | | */ |
9 | | #ifndef BITCOIN_UTIL_STRENCODINGS_H |
10 | | #define BITCOIN_UTIL_STRENCODINGS_H |
11 | | |
12 | | #include <crypto/hex_base.h> // IWYU pragma: export |
13 | | #include <span.h> |
14 | | #include <util/string.h> |
15 | | |
16 | | #include <array> |
17 | | #include <bit> |
18 | | #include <charconv> |
19 | | #include <cstddef> |
20 | | #include <cstdint> |
21 | | #include <limits> |
22 | | #include <optional> |
23 | | #include <string> // IWYU pragma: export |
24 | | #include <string_view> // IWYU pragma: export |
25 | | #include <system_error> |
26 | | #include <type_traits> |
27 | | #include <vector> |
28 | | |
29 | | /** Used by SanitizeString() */ |
30 | | enum SafeChars |
31 | | { |
32 | | SAFE_CHARS_DEFAULT, //!< The full set of allowed chars |
33 | | SAFE_CHARS_UA_COMMENT, //!< BIP-0014 subset |
34 | | SAFE_CHARS_FILENAME, //!< Chars allowed in filenames |
35 | | SAFE_CHARS_URI, //!< Chars allowed in URIs (RFC 3986) |
36 | | }; |
37 | | |
38 | | /** |
39 | | * Used by ParseByteUnits() |
40 | | * Lowercase base 1000 |
41 | | * Uppercase base 1024 |
42 | | */ |
43 | | enum class ByteUnit : uint64_t { |
44 | | NOOP = 1ULL, |
45 | | k = 1000ULL, |
46 | | K = 1024ULL, |
47 | | m = 1'000'000ULL, |
48 | | M = 1ULL << 20, |
49 | | g = 1'000'000'000ULL, |
50 | | G = 1ULL << 30, |
51 | | t = 1'000'000'000'000ULL, |
52 | | T = 1ULL << 40, |
53 | | }; |
54 | | |
55 | | /** |
56 | | * Remove unsafe chars. Safe chars chosen to allow simple messages/URLs/email |
57 | | * addresses, but avoid anything even possibly remotely dangerous like & or > |
58 | | * @param[in] str The string to sanitize |
59 | | * @param[in] rule The set of safe chars to choose (default: least restrictive) |
60 | | * @return A new string without unsafe chars |
61 | | */ |
62 | | std::string SanitizeString(std::string_view str, int rule = SAFE_CHARS_DEFAULT); |
63 | | /** Parse the hex string into bytes (uint8_t or std::byte). Ignores whitespace. Returns nullopt on invalid input. */ |
64 | | template <typename Byte = std::byte> |
65 | | std::optional<std::vector<Byte>> TryParseHex(std::string_view str); |
66 | | /** Like TryParseHex, but returns an empty vector on invalid input. */ |
67 | | template <typename Byte = uint8_t> |
68 | | std::vector<Byte> ParseHex(std::string_view hex_str) |
69 | 0 | { |
70 | 0 | return TryParseHex<Byte>(hex_str).value_or(std::vector<Byte>{}); |
71 | 0 | } Unexecuted instantiation: _Z8ParseHexIhESt6vectorIT_SaIS1_EESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z8ParseHexISt4byteESt6vectorIT_SaIS2_EESt17basic_string_viewIcSt11char_traitsIcEE |
72 | | /* Returns true if each character in str is a hex character, and has an even |
73 | | * number of hex digits.*/ |
74 | | bool IsHex(std::string_view str); |
75 | | std::optional<std::vector<unsigned char>> DecodeBase64(std::string_view str); |
76 | | std::string EncodeBase64(Span<const unsigned char> input); |
77 | 0 | inline std::string EncodeBase64(Span<const std::byte> input) { return EncodeBase64(MakeUCharSpan(input)); } |
78 | 0 | inline std::string EncodeBase64(std::string_view str) { return EncodeBase64(MakeUCharSpan(str)); } |
79 | | std::optional<std::vector<unsigned char>> DecodeBase32(std::string_view str); |
80 | | |
81 | | /** |
82 | | * Base32 encode. |
83 | | * If `pad` is true, then the output will be padded with '=' so that its length |
84 | | * is a multiple of 8. |
85 | | */ |
86 | | std::string EncodeBase32(Span<const unsigned char> input, bool pad = true); |
87 | | |
88 | | /** |
89 | | * Base32 encode. |
90 | | * If `pad` is true, then the output will be padded with '=' so that its length |
91 | | * is a multiple of 8. |
92 | | */ |
93 | | std::string EncodeBase32(std::string_view str, bool pad = true); |
94 | | |
95 | | /** |
96 | | * Splits socket address string into host string and port value. |
97 | | * Validates port value. |
98 | | * |
99 | | * @param[in] in The socket address string to split. |
100 | | * @param[out] portOut Port-portion of the input, if found and parsable. |
101 | | * @param[out] hostOut Host-portion of the input, if found. |
102 | | * @return true if port-portion is absent or within its allowed range, otherwise false |
103 | | */ |
104 | | bool SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut); |
105 | | |
106 | | // LocaleIndependentAtoi is provided for backwards compatibility reasons. |
107 | | // |
108 | | // New code should use ToIntegral or the ParseInt* functions |
109 | | // which provide parse error feedback. |
110 | | // |
111 | | // The goal of LocaleIndependentAtoi is to replicate the defined behaviour of |
112 | | // std::atoi as it behaves under the "C" locale, and remove some undefined |
113 | | // behavior. If the parsed value is bigger than the integer type's maximum |
114 | | // value, or smaller than the integer type's minimum value, std::atoi has |
115 | | // undefined behavior, while this function returns the maximum or minimum |
116 | | // values, respectively. |
117 | | template <typename T> |
118 | | T LocaleIndependentAtoi(std::string_view str) |
119 | 0 | { |
120 | 0 | static_assert(std::is_integral<T>::value); |
121 | 0 | T result; |
122 | | // Emulate atoi(...) handling of white space and leading +/-. |
123 | 0 | std::string_view s = util::TrimStringView(str); |
124 | 0 | if (!s.empty() && s[0] == '+') { |
125 | 0 | if (s.length() >= 2 && s[1] == '-') { |
126 | 0 | return 0; |
127 | 0 | } |
128 | 0 | s = s.substr(1); |
129 | 0 | } |
130 | 0 | auto [_, error_condition] = std::from_chars(s.data(), s.data() + s.size(), result); |
131 | 0 | if (error_condition == std::errc::result_out_of_range) { |
132 | 0 | if (s.length() >= 1 && s[0] == '-') { |
133 | | // Saturate underflow, per strtoll's behavior. |
134 | 0 | return std::numeric_limits<T>::min(); |
135 | 0 | } else { |
136 | | // Saturate overflow, per strtoll's behavior. |
137 | 0 | return std::numeric_limits<T>::max(); |
138 | 0 | } |
139 | 0 | } else if (error_condition != std::errc{}) { |
140 | 0 | return 0; |
141 | 0 | } |
142 | 0 | return result; |
143 | 0 | } Unexecuted instantiation: _Z21LocaleIndependentAtoiIiET_St17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z21LocaleIndependentAtoiIlET_St17basic_string_viewIcSt11char_traitsIcEE |
144 | | |
145 | | /** |
146 | | * Tests if the given character is a decimal digit. |
147 | | * @param[in] c character to test |
148 | | * @return true if the argument is a decimal digit; otherwise false. |
149 | | */ |
150 | | constexpr bool IsDigit(char c) |
151 | 0 | { |
152 | 0 | return c >= '0' && c <= '9'; |
153 | 0 | } |
154 | | |
155 | | /** |
156 | | * Tests if the given character is a whitespace character. The whitespace characters |
157 | | * are: space, form-feed ('\f'), newline ('\n'), carriage return ('\r'), horizontal |
158 | | * tab ('\t'), and vertical tab ('\v'). |
159 | | * |
160 | | * This function is locale independent. Under the C locale this function gives the |
161 | | * same result as std::isspace. |
162 | | * |
163 | | * @param[in] c character to test |
164 | | * @return true if the argument is a whitespace character; otherwise false |
165 | | */ |
166 | 0 | constexpr inline bool IsSpace(char c) noexcept { |
167 | 0 | return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'; |
168 | 0 | } |
169 | | |
170 | | /** |
171 | | * Convert string to integral type T. Leading whitespace, a leading +, or any |
172 | | * trailing character fail the parsing. The required format expressed as regex |
173 | | * is `-?[0-9]+`. The minus sign is only permitted for signed integer types. |
174 | | * |
175 | | * @returns std::nullopt if the entire string could not be parsed, or if the |
176 | | * parsed value is not in the range representable by the type T. |
177 | | */ |
178 | | template <typename T> |
179 | | std::optional<T> ToIntegral(std::string_view str) |
180 | 0 | { |
181 | 0 | static_assert(std::is_integral<T>::value); |
182 | 0 | T result; |
183 | 0 | const auto [first_nonmatching, error_condition] = std::from_chars(str.data(), str.data() + str.size(), result); |
184 | 0 | if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) { |
185 | 0 | return std::nullopt; |
186 | 0 | } |
187 | 0 | return result; |
188 | 0 | } Unexecuted instantiation: _Z10ToIntegralIlESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z10ToIntegralIiESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z10ToIntegralIhESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z10ToIntegralItESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z10ToIntegralIjESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _Z10ToIntegralImESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE |
189 | | |
190 | | /** |
191 | | * Convert string to signed 32-bit integer with strict parse error feedback. |
192 | | * @returns true if the entire string could be parsed as valid integer, |
193 | | * false if not the entire string could be parsed or when overflow or underflow occurred. |
194 | | */ |
195 | | [[nodiscard]] bool ParseInt32(std::string_view str, int32_t *out); |
196 | | |
197 | | /** |
198 | | * Convert string to signed 64-bit integer with strict parse error feedback. |
199 | | * @returns true if the entire string could be parsed as valid integer, |
200 | | * false if not the entire string could be parsed or when overflow or underflow occurred. |
201 | | */ |
202 | | [[nodiscard]] bool ParseInt64(std::string_view str, int64_t *out); |
203 | | |
204 | | /** |
205 | | * Convert decimal string to unsigned 8-bit integer with strict parse error feedback. |
206 | | * @returns true if the entire string could be parsed as valid integer, |
207 | | * false if not the entire string could be parsed or when overflow or underflow occurred. |
208 | | */ |
209 | | [[nodiscard]] bool ParseUInt8(std::string_view str, uint8_t *out); |
210 | | |
211 | | /** |
212 | | * Convert decimal string to unsigned 16-bit integer with strict parse error feedback. |
213 | | * @returns true if the entire string could be parsed as valid integer, |
214 | | * false if the entire string could not be parsed or if overflow or underflow occurred. |
215 | | */ |
216 | | [[nodiscard]] bool ParseUInt16(std::string_view str, uint16_t* out); |
217 | | |
218 | | /** |
219 | | * Convert decimal string to unsigned 32-bit integer with strict parse error feedback. |
220 | | * @returns true if the entire string could be parsed as valid integer, |
221 | | * false if not the entire string could be parsed or when overflow or underflow occurred. |
222 | | */ |
223 | | [[nodiscard]] bool ParseUInt32(std::string_view str, uint32_t *out); |
224 | | |
225 | | /** |
226 | | * Convert decimal string to unsigned 64-bit integer with strict parse error feedback. |
227 | | * @returns true if the entire string could be parsed as valid integer, |
228 | | * false if not the entire string could be parsed or when overflow or underflow occurred. |
229 | | */ |
230 | | [[nodiscard]] bool ParseUInt64(std::string_view str, uint64_t *out); |
231 | | |
232 | | /** |
233 | | * Format a paragraph of text to a fixed width, adding spaces for |
234 | | * indentation to any added line. |
235 | | */ |
236 | | std::string FormatParagraph(std::string_view in, size_t width = 79, size_t indent = 0); |
237 | | |
238 | | /** |
239 | | * Timing-attack-resistant comparison. |
240 | | * Takes time proportional to length |
241 | | * of first argument. |
242 | | */ |
243 | | template <typename T> |
244 | | bool TimingResistantEqual(const T& a, const T& b) |
245 | 0 | { |
246 | 0 | if (b.size() == 0) return a.size() == 0; |
247 | 0 | size_t accumulator = a.size() ^ b.size(); |
248 | 0 | for (size_t i = 0; i < a.size(); i++) |
249 | 0 | accumulator |= size_t(a[i] ^ b[i%b.size()]); |
250 | 0 | return accumulator == 0; |
251 | 0 | } |
252 | | |
253 | | /** Parse number as fixed point according to JSON number syntax. |
254 | | * @returns true on success, false on error. |
255 | | * @note The result must be in the range (-10^18,10^18), otherwise an overflow error will trigger. |
256 | | */ |
257 | | [[nodiscard]] bool ParseFixedPoint(std::string_view, int decimals, int64_t *amount_out); |
258 | | |
259 | | namespace { |
260 | | /** Helper class for the default infn argument to ConvertBits (just returns the input). */ |
261 | | struct IntIdentity |
262 | | { |
263 | 0 | [[maybe_unused]] int operator()(int x) const { return x; } Unexecuted instantiation: addition_overflow.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: addrman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: asmap.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: asmap_direct.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: autofile.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: banman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: base_encode_decode.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bech32.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bip324.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bitdeque.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bitset.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: block.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: block_header.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: block_index.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: blockfilter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bloom_filter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: buffered_file.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: chain.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: checkqueue.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: cluster_linearize.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coins_view.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coinscache_sim.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: connman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_aes256.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_aes256cbc.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_chacha20.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_chacha20poly1305.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_common.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_diff_fuzz_chacha20.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_hkdf_hmac_sha256_l32.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypto_poly1305.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: cuckoocache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: decode_tx.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: descriptor_parse.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: deserialize.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: eval_script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: feefrac.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: fee_rate.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: feeratediagram.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: fees.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: flatfile.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: float.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: golomb_rice.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: headerssync.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: hex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: http_request.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: i2p.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: integer.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: key.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: key_io.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: kitchen_sink.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: load_external_block_file.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: locale.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: merkleblock.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: message.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: miniscript.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: minisketch.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mini_miner.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: muhash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: multiplication_overflow.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: net.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: net_permissions.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: netaddress.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: netbase_dns_lookup.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: node_eviction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: p2p_handshake.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: p2p_headers_presync.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: p2p_transport_serialization.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: package_eval.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: parse_hd_keypath.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: parse_numbers.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: parse_script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: parse_univalue.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: partially_downloaded_block.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: policy_estimator.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: policy_estimator_io.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: poolresource.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: pow.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: primitives_transaction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: process_message.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: process_messages.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: protocol.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: psbt.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: random.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: rbf.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: rolling_bloom_filter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: rpc.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_assets_test_minimizer.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_descriptor_cache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_flags.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_format.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_interpreter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_ops.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_sigcache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: script_sign.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: scriptnum_ops.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: secp256k1_ec_seckey_import_export_der.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: secp256k1_ecdsa_signature_parse_der_lax.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: signature_checker.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: signet.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: socks5.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: span.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: string.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: strprintf.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: system.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: timeoffsets.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: torcontrol.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: transaction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txdownloadman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: tx_in.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: tx_out.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: tx_pool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txorphan.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txrequest.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: utxo_snapshot.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: utxo_total_supply.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: validation_load_mempool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: vecdeque.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: versionbits.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coincontrol.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coinselection.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: crypter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: notifications.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: parse_iso8601.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: scriptpubkeyman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: spend.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: wallet_bdb_parser.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: descriptor.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mempool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: fuzz.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: util.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: addresstype.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: base58.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: chainparams.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coins.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bloom.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: messages.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: signmessage.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: compressor.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: core_read.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: core_write.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: deploymentinfo.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: netbase.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: outputtype.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: policy.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: request.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: sign.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: signingprovider.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: solver.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bip32.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: bytevectorhash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: hasher.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: moneystr.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: strencodings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: dump.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: receive.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: wallet.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: walletdb.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: walletutil.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: sqlite.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: db.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: interfaces.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: load.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: feebumper.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: addresses.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: backup.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: encrypt.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: transactions.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mining.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: setup_common.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: transaction_utils.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txmempool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: validation.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: addrdb.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: blockencodings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: tx_verify.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: dbwrapper.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: httpserver.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: init.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: checks.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coinstats.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: context.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mapport.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: net_processing.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: netgroup.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: blockmanager_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: blockstorage.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: caches.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: chainstate.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: chainstatemanager_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coins_view_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: eviction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: kernel_notifications.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mempool_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mempool_persist.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: mempool_persist_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: miner.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: peerman_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txdownloadman_impl.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txreconciliation.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: packages.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: settings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: rest.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: blockchain.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: node.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: output_script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: rawtransaction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: server.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: server_util.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txoutproof.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: sigcache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txdb.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txorphanage.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: validationinterface.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: httprpc.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: base.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: blockfilterindex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coinstatsindex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: txindex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: disconnected_transactions.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: coin.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: truc_policy.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: netif.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: pcp.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: external_signer.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: net_types.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: rawtransaction_util.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: arith_uint256.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: merkle.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: tx_check.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: hash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: pubkey.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: interpreter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: uint256.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi Unexecuted instantiation: siphash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi |
264 | | }; |
265 | | |
266 | | } // namespace |
267 | | |
268 | | /** Convert from one power-of-2 number base to another. */ |
269 | | template<int frombits, int tobits, bool pad, typename O, typename It, typename I = IntIdentity> |
270 | 0 | bool ConvertBits(O outfn, It it, It end, I infn = {}) { |
271 | 0 | size_t acc = 0; |
272 | 0 | size_t bits = 0; |
273 | 0 | constexpr size_t maxv = (1 << tobits) - 1; |
274 | 0 | constexpr size_t max_acc = (1 << (frombits + tobits - 1)) - 1; |
275 | 0 | while (it != end) { |
276 | 0 | int v = infn(*it); |
277 | 0 | if (v < 0) return false; |
278 | 0 | acc = ((acc << frombits) | v) & max_acc; |
279 | 0 | bits += frombits; |
280 | 0 | while (bits >= tobits) { |
281 | 0 | bits -= tobits; |
282 | 0 | outfn((acc >> bits) & maxv); |
283 | 0 | } |
284 | 0 | ++it; |
285 | 0 | } |
286 | 0 | if (pad) { |
287 | 0 | if (bits) outfn((acc << (tobits - bits)) & maxv); |
288 | 0 | } else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) { |
289 | 0 | return false; |
290 | 0 | } |
291 | 0 | return true; |
292 | 0 | } Unexecuted instantiation: bech32.cpp:_Z11ConvertBitsILi8ELi5ELb1EZ18bech32_fuzz_targetSt4spanIKhLm18446744073709551615EEE3$_0N9__gnu_cxx17__normal_iteratorIPS1_S2_EEN12_GLOBAL__N_111IntIdentityEEbT2_T3_SB_T4_ Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK19WitnessV0ScriptHashEUlhE_PKhNS0_11IntIdentityEEbT2_T3_SA_T4_ Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK16WitnessV0KeyHashEUlhE_PKhNS0_11IntIdentityEEbT2_T3_SA_T4_ Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK16WitnessV1TaprootEUlhE_PKhNS0_11IntIdentityEEbT2_T3_SA_T4_ Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK14WitnessUnknownEUlhE_N9__gnu_cxx17__normal_iteratorIPKhSt6vectorIhSaIhEEEENS0_11IntIdentityEEbT2_T3_SG_T4_ Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi5ELi8ELb0EZN12_GLOBAL__N_117DecodeDestinationERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12CChainParamsRS6_PSt6vectorIiSaIiEEE3$_0N9__gnu_cxx17__normal_iteratorIPKhSD_IhSaIhEEEENS0_11IntIdentityEEbT2_T3_SR_T4_ Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi8ELi6ELb1EZ12EncodeBase64B5cxx114SpanIKhEE3$_0PS1_N12_GLOBAL__N_111IntIdentityEEbT2_T3_S8_T4_ Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi6ELi8ELb0EZ12DecodeBase64St17basic_string_viewIcSt11char_traitsIcEEE3$_0PKcZ12DecodeBase64S3_E3$_1EbT2_T3_S9_T4_ Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi8ELi5ELb1EZ12EncodeBase32B5cxx114SpanIKhEbE3$_0PS1_N12_GLOBAL__N_111IntIdentityEEbT2_T3_S8_T4_ Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi5ELi8ELb0EZ12DecodeBase32St17basic_string_viewIcSt11char_traitsIcEEE3$_0PKcZ12DecodeBase32S3_E3$_1EbT2_T3_S9_T4_ |
293 | | |
294 | | /** |
295 | | * Converts the given character to its lowercase equivalent. |
296 | | * This function is locale independent. It only converts uppercase |
297 | | * characters in the standard 7-bit ASCII range. |
298 | | * This is a feature, not a limitation. |
299 | | * |
300 | | * @param[in] c the character to convert to lowercase. |
301 | | * @return the lowercase equivalent of c; or the argument |
302 | | * if no conversion is possible. |
303 | | */ |
304 | | constexpr char ToLower(char c) |
305 | 0 | { |
306 | 0 | return (c >= 'A' && c <= 'Z' ? (c - 'A') + 'a' : c); |
307 | 0 | } |
308 | | |
309 | | /** |
310 | | * Returns the lowercase equivalent of the given string. |
311 | | * This function is locale independent. It only converts uppercase |
312 | | * characters in the standard 7-bit ASCII range. |
313 | | * This is a feature, not a limitation. |
314 | | * |
315 | | * @param[in] str the string to convert to lowercase. |
316 | | * @returns lowercased equivalent of str |
317 | | */ |
318 | | std::string ToLower(std::string_view str); |
319 | | |
320 | | /** |
321 | | * Converts the given character to its uppercase equivalent. |
322 | | * This function is locale independent. It only converts lowercase |
323 | | * characters in the standard 7-bit ASCII range. |
324 | | * This is a feature, not a limitation. |
325 | | * |
326 | | * @param[in] c the character to convert to uppercase. |
327 | | * @return the uppercase equivalent of c; or the argument |
328 | | * if no conversion is possible. |
329 | | */ |
330 | | constexpr char ToUpper(char c) |
331 | 0 | { |
332 | 0 | return (c >= 'a' && c <= 'z' ? (c - 'a') + 'A' : c); |
333 | 0 | } |
334 | | |
335 | | /** |
336 | | * Returns the uppercase equivalent of the given string. |
337 | | * This function is locale independent. It only converts lowercase |
338 | | * characters in the standard 7-bit ASCII range. |
339 | | * This is a feature, not a limitation. |
340 | | * |
341 | | * @param[in] str the string to convert to uppercase. |
342 | | * @returns UPPERCASED EQUIVALENT OF str |
343 | | */ |
344 | | std::string ToUpper(std::string_view str); |
345 | | |
346 | | /** |
347 | | * Capitalizes the first character of the given string. |
348 | | * This function is locale independent. It only converts lowercase |
349 | | * characters in the standard 7-bit ASCII range. |
350 | | * This is a feature, not a limitation. |
351 | | * |
352 | | * @param[in] str the string to capitalize. |
353 | | * @returns string with the first letter capitalized. |
354 | | */ |
355 | | std::string Capitalize(std::string str); |
356 | | |
357 | | /** |
358 | | * Parse a string with suffix unit [k|K|m|M|g|G|t|T]. |
359 | | * Must be a whole integer, fractions not allowed (0.5t), no whitespace or +- |
360 | | * Lowercase units are 1000 base. Uppercase units are 1024 base. |
361 | | * Examples: 2m,27M,19g,41T |
362 | | * |
363 | | * @param[in] str the string to convert into bytes |
364 | | * @param[in] default_multiplier if no unit is found in str use this unit |
365 | | * @returns optional uint64_t bytes from str or nullopt |
366 | | * if ToIntegral is false, str is empty, trailing whitespace or overflow |
367 | | */ |
368 | | std::optional<uint64_t> ParseByteUnits(std::string_view str, ByteUnit default_multiplier); |
369 | | |
370 | | namespace util { |
371 | | /** consteval version of HexDigit() without the lookup table. */ |
372 | | consteval uint8_t ConstevalHexDigit(const char c) |
373 | | { |
374 | | if (c >= '0' && c <= '9') return c - '0'; |
375 | | if (c >= 'a' && c <= 'f') return c - 'a' + 0xa; |
376 | | |
377 | | throw "Only lowercase hex digits are allowed, for consistency"; |
378 | | } |
379 | | |
380 | | /** |
381 | | * ""_hex is a compile-time user-defined literal returning a |
382 | | * `std::array<std::byte>`, equivalent to ParseHex(). Variants provided: |
383 | | * |
384 | | * - ""_hex_v: Returns `std::vector<std::byte>`, useful for heap allocation or |
385 | | * variable-length serialization. |
386 | | * |
387 | | * - ""_hex_u8: Returns `std::array<uint8_t>`, for cases where `std::byte` is |
388 | | * incompatible. |
389 | | * |
390 | | * - ""_hex_v_u8: Returns `std::vector<uint8_t>`, combining heap allocation with |
391 | | * `uint8_t`. |
392 | | * |
393 | | * @warning It could be necessary to use vector instead of array variants when |
394 | | * serializing, or vice versa, because vectors are assumed to be variable- |
395 | | * length and serialized with a size prefix, while arrays are considered fixed |
396 | | * length and serialized with no prefix. |
397 | | * |
398 | | * @warning It may be preferable to use vector variants to save stack space when |
399 | | * declaring local variables if hex strings are large. Alternatively variables |
400 | | * could be declared constexpr to avoid using stack space. |
401 | | * |
402 | | * @warning Avoid `uint8_t` variants when not necessary, as the codebase |
403 | | * migrates to use `std::byte` instead of `unsigned char` and `uint8_t`. |
404 | | * |
405 | | * @note One reason ""_hex uses `std::array` instead of `std::vector` like |
406 | | * ParseHex() does is because heap-based containers cannot cross the compile- |
407 | | * time/runtime barrier. |
408 | | */ |
409 | | inline namespace hex_literals { |
410 | | namespace detail { |
411 | | |
412 | | template <size_t N> |
413 | | struct Hex { |
414 | | std::array<std::byte, N / 2> bytes{}; |
415 | | consteval Hex(const char (&hex_str)[N]) |
416 | | // 2 hex digits required per byte + implicit null terminator |
417 | | requires(N % 2 == 1) |
418 | | { |
419 | | if (hex_str[N - 1]) throw "null terminator required"; |
420 | | for (std::size_t i = 0; i < bytes.size(); ++i) { |
421 | | bytes[i] = static_cast<std::byte>( |
422 | | (ConstevalHexDigit(hex_str[2 * i]) << 4) | |
423 | | ConstevalHexDigit(hex_str[2 * i + 1])); |
424 | | } |
425 | | } |
426 | | }; |
427 | | |
428 | | } // namespace detail |
429 | | |
430 | | template <util::detail::Hex str> |
431 | 0 | constexpr auto operator""_hex() { return str.bytes; } Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm131EEEtlSt5arrayISt4byteLm65EEtlA65_S6_LS6_4ELS6_103ELS6_138ELS6_253ELS6_176ELS6_254ELS6_85ELS6_72ELS6_39ELS6_25ELS6_103ELS6_241ELS6_166ELS6_113ELS6_48ELS6_183ELS6_16ELS6_92ELS6_214ELS6_168ELS6_40ELS6_224ELS6_57ELS6_9ELS6_166ELS6_121ELS6_98ELS6_224ELS6_234ELS6_31ELS6_97ELS6_222ELS6_182ELS6_73ELS6_246ELS6_188ELS6_63ELS6_76ELS6_239ELS6_56ELS6_196ELS6_243ELS6_85ELS6_4ELS6_229ELS6_30ELS6_193ELS6_18ELS6_222ELS6_92ELS6_56ELS6_77ELS6_247ELS6_186ELS6_11ELS6_141ELS6_87ELS6_138ELS6_76ELS6_112ELS6_43ELS6_107ELS6_241ELS6_29ELS6_95EEEEEEEDav Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm67EEEEEEEDav Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm6109EEEtlSt5arrayISt4byteLm3054EEtlA3054_S6_LS6_1ELS6_0ELS6_0ELS6_0ELS6_144ELS6_240ELS6_169ELS6_241ELS6_16ELS6_112ELS6_47ELS6_128ELS6_130ELS6_25ELS6_235ELS6_234ELS6_17ELS6_115ELS6_5ELS6_96ELS6_66ELS6_167ELS6_20ELS6_186ELS6_213ELS6_27ELS6_145ELS6_108ELS6_182ELS6_128ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_82ELS6_117ELS6_40ELS6_149ELS6_88ELS6_245ELS6_28ELS6_153ELS6_102ELS6_105ELS6_148ELS6_4ELS6_174ELS6_34ELS6_148ELS6_115ELS6_12ELS6_60ELS6_159ELS6_155ELS6_218ELS6_83ELS6_82ELS6_60ELS6_229ELS6_14ELS6_155ELS6_149ELS6_229ELS6_88ELS6_218ELS6_47ELS6_219ELS6_38ELS6_27ELS6_77ELS6_76ELS6_134ELS6_4ELS6_27ELS6_26ELS6_177ELS6_191ELS6_147ELS6_9ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_255ELS6_7ELS6_4ELS6_76ELS6_134ELS6_4ELS6_27ELS6_1ELS6_70ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_0ELS6_242ELS6_5ELS6_42ELS6_1ELS6_0ELS6_0ELS6_0ELS6_67ELS6_65ELS6_4ELS6_225ELS6_143ELS6_122ELS6_251ELS6_228ELS6_114ELS6_21ELS6_128ELS6_232ELS6_30ELS6_132ELS6_20ELS6_252ELS6_140ELS6_36ELS6_215ELS6_207ELS6_172ELS6_242ELS6_84ELS6_187ELS6_92ELS6_123ELS6_148ELS6_148ELS6_80ELS6_195ELS6_233ELS6_151ELS6_194ELS6_220ELS6_18ELS6_66ELS6_72ELS6_122ELS6_129ELS6_105ELS6_80ELS6_123ELS6_99ELS6_30ELS6_179ELS6_119ELS6_31ELS6_43ELS6_66ELS6_84ELS6_131ELS6_251ELS6_19ELS6_16ELS6_44ELS6_78ELS6_181ELS6_216ELS6_88ELS6_238ELS6_242ELS6_96ELS6_254ELS6_112ELS6_251ELS6_250ELS6_224ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_150ELS6_96ELS6_140ELS6_203ELS6_175ELS6_161ELS6_106ELS6_186ELS6_218ELS6_144ELS6_39ELS6_128ELS6_218ELS6_77ELS6_195ELS6_93ELS6_175ELS6_215ELS6_175ELS6_5ELS6_250ELS6_13ELS6_160ELS6_140ELS6_248ELS6_51ELS6_87ELS6_95ELS6_140ELS6_249ELS6_232ELS6_54ELS6_0ELS6_0ELS6_0ELS6_0ELS6_74ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_218ELS6_178ELS6_72ELS6_137ELS6_33ELS6_60ELS6_175ELS6_67ELS6_174ELS6_106ELS6_220ELS6_65ELS6_207ELS6_28ELS6_147ELS6_150ELS6_192ELS6_130ELS6_64ELS6_193ELS6_153ELS6_245ELS6_34ELS6_90ELS6_207ELS6_69ELS6_65ELS6_99ELS6_48ELS6_253ELS6_125ELS6_189ELS6_2ELS6_33ELS6_0ELS6_254ELS6_55ELS6_144ELS6_14ELS6_6ELS6_68ELS6_191ELS6_87ELS6_68ELS6_147ELS6_160ELS6_127ELS6_197ELS6_237ELS6_186ELS6_6ELS6_219ELS6_192ELS6_124ELS6_49ELS6_27ELS6_148ELS6_117ELS6_32ELS6_194ELS6_213ELS6_20ELS6_188ELS6_87ELS6_37ELS6_220ELS6_180ELS6_1ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_0ELS6_242ELS6_5ELS6_42ELS6_1ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_241ELS6_93ELS6_25ELS6_33ELS6_245ELS6_46ELS6_64ELS6_7ELS6_177ELS6_70ELS6_223ELS6_166ELS6_15ELS6_54ELS6_158ELS6_210ELS6_252ELS6_57ELS6_60ELS6_226ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_251ELS6_118ELS6_108ELS6_18ELS6_136ELS6_69ELS6_140ELS6_43ELS6_175ELS6_207ELS6_236ELS6_129ELS6_228ELS6_139ELS6_36ELS6_217ELS6_142ELS6_199ELS6_6ELS6_222ELS6_107ELS6_138ELS6_247ELS6_196ELS6_227ELS6_194ELS6_148ELS6_25ELS6_191ELS6_172ELS6_181ELS6_109ELS6_0ELS6_0ELS6_0ELS6_0ELS6_140ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_242ELS6_104ELS6_186ELS6_22ELS6_92ELS6_224ELS6_173ELS6_46ELS6_109ELS6_147ELS6_240ELS6_137ELS6_207ELS6_205ELS6_55ELS6_133ELS6_222ELS6_92ELS6_150ELS6_59ELS6_181ELS6_234ELS6_107ELS6_140ELS6_27ELS6_35ELS6_241ELS6_206ELS6_62ELS6_81ELS6_123ELS6_159ELS6_2ELS6_33ELS6_0ELS6_218ELS6_124ELS6_15ELS6_33ELS6_173ELS6_198ELS6_196ELS6_1ELS6_136ELS6_127ELS6_43ELS6_253ELS6_25ELS6_34ELS6_241ELS6_29ELS6_118ELS6_21ELS6_156ELS6_188ELS6_89ELS6_127ELS6_189ELS6_117ELS6_106ELS6_35ELS6_220ELS6_187ELS6_0ELS6_244ELS6_215ELS6_41ELS6_1ELS6_65ELS6_4ELS6_43ELS6_78ELS6_134ELS6_37ELS6_169ELS6_97ELS6_39ELS6_130ELS6_105ELS6_21ELS6_165ELS6_177ELS6_9ELS6_133ELS6_38ELS6_54ELS6_173ELS6_13ELS6_167ELS6_83ELS6_201ELS6_225ELS6_213ELS6_96ELS6_106ELS6_80ELS6_72ELS6_12ELS6_208ELS6_196ELS6_15ELS6_31ELS6_139ELS6_141ELS6_137ELS6_130ELS6_53ELS6_229ELS6_113ELS6_254ELS6_147ELS6_87ELS6_217ELS6_236ELS6_132ELS6_43ELS6_196ELS6_187ELS6_161ELS6_130ELS6_125ELS6_170ELS6_244ELS6_222ELS6_6ELS6_215ELS6_24ELS6_68ELS6_208ELS6_5ELS6_119ELS6_7ELS6_150ELS6_106ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_128ELS6_150ELS6_152ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_105ELS6_99ELS6_144ELS6_117ELS6_49ELS6_219ELS6_114ELS6_208ELS6_237ELS6_26ELS6_12ELS6_251ELS6_71ELS6_28ELS6_203ELS6_99ELS6_146ELS6_52ELS6_70ELS6_243ELS6_136ELS6_172ELS6_128ELS6_214ELS6_227ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_240ELS6_104ELS6_139ELS6_161ELS6_192ELS6_209ELS6_206ELS6_24ELS6_44ELS6_122ELS6_246ELS6_116ELS6_30ELS6_2ELS6_101ELS6_140ELS6_125ELS6_77ELS6_252ELS6_211ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_2ELS6_196ELS6_2ELS6_151ELS6_247ELS6_48ELS6_221ELS6_123ELS6_90ELS6_153ELS6_86ELS6_126ELS6_184ELS6_210ELS6_123ELS6_120ELS6_117ELS6_143ELS6_96ELS6_117ELS6_7ELS6_197ELS6_34ELS6_146ELS6_208ELS6_45ELS6_64ELS6_49ELS6_137ELS6_91ELS6_82ELS6_242ELS6_255ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_247ELS6_237ELS6_253ELS6_75ELS6_10ELS6_172ELS6_64ELS6_78ELS6_91ELS6_171ELS6_79ELS6_211ELS6_136ELS6_158ELS6_12ELS6_108ELS6_65ELS6_170ELS6_141ELS6_14ELS6_111ELS6_161ELS6_34ELS6_49ELS6_111ELS6_104ELS6_237ELS6_221ELS6_10ELS6_101ELS6_1ELS6_57ELS6_2ELS6_32ELS6_91ELS6_9ELS6_204ELS6_139ELS6_45ELS6_86ELS6_225ELS6_205ELS6_31ELS6_127ELS6_47ELS6_175ELS6_214ELS6_10ELS6_18ELS6_158ELS6_217ELS6_69ELS6_4ELS6_196ELS6_172ELS6_123ELS6_220ELS6_103ELS6_181ELS6_111ELS6_230ELS6_117ELS6_18ELS6_101ELS6_139ELS6_62ELS6_1ELS6_65ELS6_4ELS6_115ELS6_32ELS6_18ELS6_203ELS6_150ELS6_42ELS6_250ELS6_144ELS6_211ELS6_27ELS6_37ELS6_216ELS6_251ELS6_14ELS6_50ELS6_201ELS6_78ELS6_81ELS6_58ELS6_183ELS6_161ELS6_120ELS6_5ELS6_193ELS6_76ELS6_164ELS6_195ELS6_66ELS6_62ELS6_24ELS6_180ELS6_251ELS6_93ELS6_14ELS6_103ELS6_104ELS6_65ELS6_115ELS6_60ELS6_184ELS6_58ELS6_186ELS6_249ELS6_117ELS6_132ELS6_92ELS6_159ELS6_111ELS6_42ELS6_128ELS6_151ELS6_183ELS6_208ELS6_79ELS6_73ELS6_8ELS6_177ELS6_131ELS6_104ELS6_214ELS6_252ELS6_45ELS6_104ELS6_236ELS6_255ELS6_255ELS6_255ELS6_255ELS6_202ELS6_80ELS6_101ELS6_255ELS6_150ELS6_23ELS6_203ELS6_203ELS6_164ELS6_94ELS6_178ELS6_55ELS6_38ELS6_223ELS6_100ELS6_152ELS6_169ELS6_185ELS6_202ELS6_254ELS6_212ELS6_245ELS6_76ELS6_186ELS6_185ELS6_210ELS6_39ELS6_176ELS6_3ELS6_93ELS6_222ELS6_251ELS6_0ELS6_0ELS6_0ELS6_0ELS6_138ELS6_71ELS6_48ELS6_68ELS6_2ELS6_32ELS6_104ELS6_1ELS6_3ELS6_98ELS6_161ELS6_60ELS6_127ELS6_153ELS6_25ELS6_250ELS6_131ELS6_43ELS6_45ELS6_238ELS6_78ELS6_120ELS6_143ELS6_97ELS6_246ELS6_245ELS6_211ELS6_68ELS6_167ELS6_194ELS6_160ELS6_218ELS6_106ELS6_231ELS6_64ELS6_96ELS6_86ELS6_88ELS6_2ELS6_32ELS6_6ELS6_209ELS6_175ELS6_82ELS6_91ELS6_154ELS6_20ELS6_163ELS6_92ELS6_0ELS6_59ELS6_120ELS6_183ELS6_43ELS6_213ELS6_151ELS6_56ELS6_205ELS6_103ELS6_111ELS6_132ELS6_93ELS6_31ELS6_243ELS6_252ELS6_37ELS6_4ELS6_158ELS6_1ELS6_0ELS6_54ELS6_20ELS6_1ELS6_65ELS6_4ELS6_115ELS6_32ELS6_18ELS6_203ELS6_150ELS6_42ELS6_250ELS6_144ELS6_211ELS6_27ELS6_37ELS6_216ELS6_251ELS6_14ELS6_50ELS6_201ELS6_78ELS6_81ELS6_58ELS6_183ELS6_161ELS6_120ELS6_5ELS6_193ELS6_76ELS6_164ELS6_195ELS6_66ELS6_62ELS6_24ELS6_180ELS6_251ELS6_93ELS6_14ELS6_103ELS6_104ELS6_65ELS6_115ELS6_60ELS6_184ELS6_58ELS6_186ELS6_249ELS6_117ELS6_132ELS6_92ELS6_159ELS6_111ELS6_42ELS6_128ELS6_151ELS6_183ELS6_208ELS6_79ELS6_73ELS6_8ELS6_177ELS6_131ELS6_104ELS6_214ELS6_252ELS6_45ELS6_104ELS6_236ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_0ELS6_30ELS6_196ELS6_17ELS6_2ELS6_0ELS6_0ELS6_0ELS6_67ELS6_65ELS6_4ELS6_105ELS6_171ELS6_65ELS6_129ELS6_236ELS6_235ELS6_40ELS6_152ELS6_91ELS6_155ELS6_78ELS6_137ELS6_92ELS6_19ELS6_250ELS6_94ELS6_104ELS6_216ELS6_87ELS6_97ELS6_183ELS6_238ELS6_227ELS6_17ELS6_219ELS6_90ELS6_221ELS6_239ELS6_118ELS6_250ELS6_134ELS6_33ELS6_134ELS6_81ELS6_52ELS6_162ELS6_33ELS6_189ELS6_1ELS6_242ELS6_142ELS6_201ELS6_153ELS6_158ELS6_227ELS6_224ELS6_33ELS6_230ELS6_7ELS6_102ELS6_233ELS6_209ELS6_243ELS6_69ELS6_140ELS6_17ELS6_95ELS6_178ELS6_134ELS6_80ELS6_96ELS6_95ELS6_17ELS6_201ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_205ELS6_175ELS6_47ELS6_117ELS6_142ELS6_145ELS6_197ELS6_20ELS6_101ELS6_94ELS6_45ELS6_197ELS6_6ELS6_51ELS6_209ELS6_228ELS6_200ELS6_73ELS6_137ELS6_248ELS6_170ELS6_144ELS6_160ELS6_219ELS6_200ELS6_131ELS6_240ELS6_210ELS6_62ELS6_213ELS6_194ELS6_250ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_32ELS6_122ELS6_181ELS6_27ELS6_230ELS6_241ELS6_42ELS6_25ELS6_98ELS6_186ELS6_10ELS6_170ELS6_242ELS6_74ELS6_32ELS6_224ELS6_182ELS6_155ELS6_39ELS6_169ELS6_79ELS6_172ELS6_90ELS6_223ELS6_69ELS6_170ELS6_125ELS6_45ELS6_24ELS6_255ELS6_217ELS6_35ELS6_97ELS6_2ELS6_33ELS6_0ELS6_134ELS6_174ELS6_114ELS6_139ELS6_55ELS6_14ELS6_83ELS6_41ELS6_238ELS6_173ELS6_154ELS6_204ELS6_216ELS6_128ELS6_208ELS6_203ELS6_7ELS6_10ELS6_234ELS6_12ELS6_150ELS6_37ELS6_95ELS6_174ELS6_108ELS6_79ELS6_29ELS6_220ELS6_206ELS6_31ELS6_213ELS6_110ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_43ELS6_107ELS6_167ELS6_201ELS6_215ELS6_150ELS6_183ELS6_94ELS6_239ELS6_121ELS6_66ELS6_252ELS6_146ELS6_136ELS6_237ELS6_211ELS6_124ELS6_50ELS6_245ELS6_195ELS6_136ELS6_172ELS6_0ELS6_45ELS6_49ELS6_1ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_27ELS6_239ELS6_186ELS6_12ELS6_220ELS6_26ELS6_213ELS6_101ELS6_41ELS6_55ELS6_24ELS6_100ELS6_217ELS6_246ELS6_203ELS6_4ELS6_47ELS6_170ELS6_6ELS6_181ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_180ELS6_164ELS6_118ELS6_3ELS6_231ELS6_27ELS6_97ELS6_188ELS6_51ELS6_38ELS6_239ELS6_217ELS6_1ELS6_17ELS6_191ELS6_2ELS6_210ELS6_245ELS6_73ELS6_176ELS6_103ELS6_244ELS6_196ELS6_168ELS6_250ELS6_24ELS6_59ELS6_87ELS6_160ELS6_248ELS6_0ELS6_203ELS6_1ELS6_0ELS6_0ELS6_0ELS6_138ELS6_71ELS6_48ELS6_68ELS6_2ELS6_32ELS6_23ELS6_124ELS6_55ELS6_249ELS6_165ELS6_5ELS6_195ELS6_241ELS6_161ELS6_240ELS6_206ELS6_45ELS6_167ELS6_119ELS6_195ELS6_57ELS6_189ELS6_131ELS6_57ELS6_255ELS6_160ELS6_44ELS6_124ELS6_180ELS6_31ELS6_10ELS6_88ELS6_4ELS6_244ELS6_115ELS6_201ELS6_35ELS6_2ELS6_32ELS6_88ELS6_91ELS6_37ELS6_162ELS6_238ELS6_128ELS6_235ELS6_89ELS6_41ELS6_46ELS6_82ELS6_185ELS6_135ELS6_218ELS6_217ELS6_42ELS6_203ELS6_12ELS6_100ELS6_236ELS6_237ELS6_146ELS6_237ELS6_158ELS6_225ELS6_5ELS6_173ELS6_21ELS6_60ELS6_219ELS6_18ELS6_208ELS6_1ELS6_65ELS6_4ELS6_67ELS6_189ELS6_68ELS6_246ELS6_131ELS6_70ELS6_126ELS6_84ELS6_157ELS6_174ELS6_125ELS6_32ELS6_209ELS6_215ELS6_156ELS6_189ELS6_182ELS6_223ELS6_152ELS6_92ELS6_110ELS6_156ELS6_2ELS6_156ELS6_141ELS6_12ELS6_108ELS6_180ELS6_108ELS6_193ELS6_164ELS6_211ELS6_207ELS6_121ELS6_35ELS6_197ELS6_2ELS6_27ELS6_39ELS6_247ELS6_160ELS6_181ELS6_98ELS6_173ELS6_161ELS6_19ELS6_188ELS6_133ELS6_213ELS6_253ELS6_165ELS6_161ELS6_180ELS6_30ELS6_135ELS6_254ELS6_110ELS6_136ELS6_2ELS6_129ELS6_124ELS6_246ELS6_153ELS6_150ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_128ELS6_101ELS6_20ELS6_6ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_85ELS6_5ELS6_97ELS6_72ELS6_89ELS6_100ELS6_58ELS6_183ELS6_181ELS6_71ELS6_205ELS6_127ELS6_31ELS6_94ELS6_126ELS6_42ELS6_18ELS6_50ELS6_45ELS6_55ELS6_136ELS6_172ELS6_0ELS6_170ELS6_2ELS6_113ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_234ELS6_71ELS6_32ELS6_167ELS6_165ELS6_47ELS6_193ELS6_102ELS6_197ELS6_95ELS6_242ELS6_41ELS6_142ELS6_7ELS6_186ELS6_247ELS6_10ELS6_230ELS6_126ELS6_27ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_5ELS6_134ELS6_198ELS6_44ELS6_214ELS6_2ELS6_210ELS6_25ELS6_187ELS6_96ELS6_237ELS6_177ELS6_74ELS6_62ELS6_32ELS6_77ELS6_224ELS6_112ELS6_81ELS6_118ELS6_249ELS6_2ELS6_47ELS6_228ELS6_154ELS6_83ELS6_128ELS6_84ELS6_251ELS6_20ELS6_171ELS6_180ELS6_158ELS6_1ELS6_0ELS6_0ELS6_0ELS6_140ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_242ELS6_188ELS6_42ELS6_186ELS6_37ELS6_52ELS6_190ELS6_203ELS6_223ELS6_6ELS6_46ELS6_185ELS6_147ELS6_133ELS6_58ELS6_66ELS6_187ELS6_188ELS6_40ELS6_32ELS6_131ELS6_208ELS6_218ELS6_249ELS6_180ELS6_181ELS6_133ELS6_189ELS6_64ELS6_26ELS6_168ELS6_201ELS6_2ELS6_33ELS6_0ELS6_177ELS6_215ELS6_253ELS6_126ELS6_224ELS6_185ELS6_86ELS6_0ELS6_219ELS6_133ELS6_53ELS6_187ELS6_243ELS6_49ELS6_177ELS6_158ELS6_237ELS6_141ELS6_150ELS6_31ELS6_122ELS6_142ELS6_84ELS6_21ELS6_156ELS6_83ELS6_103ELS6_93ELS6_95ELS6_105ELS6_223ELS6_140ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_3ELS6_173ELS6_14ELS6_88ELS6_204ELS6_218ELS6_195ELS6_223ELS6_157ELS6_194ELS6_138ELS6_33ELS6_139ELS6_207ELS6_111ELS6_25ELS6_151ELS6_176ELS6_169ELS6_51ELS6_6ELS6_250ELS6_170ELS6_75ELS6_58ELS6_40ELS6_174ELS6_131ELS6_68ELS6_123ELS6_33ELS6_121ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_190ELS6_18ELS6_178ELS6_147ELS6_113ELS6_121ELS6_218ELS6_136ELS6_89ELS6_158ELS6_39ELS6_187ELS6_49ELS6_195ELS6_82ELS6_80ELS6_151ELS6_160ELS6_124ELS6_219ELS6_82ELS6_66ELS6_45ELS6_22ELS6_91ELS6_60ELS6_162ELS6_242ELS6_2ELS6_15ELS6_252ELS6_247ELS6_2ELS6_32ELS6_9ELS6_113ELS6_181ELS6_31ELS6_133ELS6_58ELS6_83ELS6_214ELS6_68ELS6_235ELS6_174ELS6_158ELS6_200ELS6_243ELS6_81ELS6_46ELS6_68ELS6_43ELS6_27ELS6_203ELS6_108ELS6_49ELS6_90ELS6_91ELS6_73ELS6_29ELS6_17ELS6_157ELS6_16ELS6_98ELS6_76ELS6_131ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_42ELS6_207ELS6_202ELS6_182ELS6_41ELS6_187ELS6_200ELS6_104ELS6_87ELS6_146ELS6_96ELS6_55ELS6_98ELS6_201ELS6_33ELS6_88ELS6_0ELS6_48ELS6_186ELS6_20ELS6_74ELS6_245ELS6_83ELS6_210ELS6_113ELS6_113ELS6_106ELS6_149ELS6_8ELS6_158ELS6_16ELS6_123ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_250ELS6_87ELS6_154ELS6_132ELS6_10ELS6_194ELS6_88ELS6_135ELS6_19ELS6_101ELS6_221ELS6_72ELS6_205ELS6_117ELS6_82ELS6_249ELS6_108ELS6_142ELS6_234ELS6_105ELS6_189ELS6_0ELS6_216ELS6_79ELS6_5ELS6_178ELS6_131ELS6_160ELS6_218ELS6_179ELS6_17ELS6_225ELS6_2ELS6_32ELS6_126ELS6_60ELS6_14ELS6_233ELS6_35ELS6_72ELS6_20ELS6_207ELS6_187ELS6_27ELS6_101ELS6_155ELS6_131ELS6_103ELS6_22ELS6_24ELS6_244ELS6_90ELS6_188ELS6_19ELS6_38ELS6_185ELS6_237ELS6_204ELS6_119ELS6_213ELS6_82ELS6_164ELS6_242ELS6_168ELS6_5ELS6_192ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_220ELS6_220ELS6_96ELS6_35ELS6_187ELS6_201ELS6_148ELS6_74ELS6_101ELS6_141ELS6_220ELS6_88ELS6_142ELS6_97ELS6_234ELS6_203ELS6_115ELS6_125ELS6_223ELS6_10ELS6_60ELS6_210ELS6_79ELS6_17ELS6_59ELS6_90ELS6_134ELS6_52ELS6_197ELS6_23ELS6_252ELS6_210ELS6_0ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_141ELS6_109ELS6_247ELS6_49ELS6_223ELS6_93ELS6_50ELS6_38ELS6_121ELS6_84ELS6_189ELS6_125ELS6_45ELS6_218ELS6_35ELS6_2ELS6_183ELS6_76ELS6_108ELS6_42ELS6_106ELS6_165ELS6_192ELS6_202ELS6_100ELS6_236ELS6_186ELS6_188ELS6_26ELS6_240ELS6_60ELS6_117ELS6_2ELS6_32ELS6_16ELS6_229ELS6_92ELS6_87ELS6_29ELS6_101ELS6_218ELS6_119ELS6_1ELS6_174ELS6_45ELS6_161ELS6_149ELS6_108ELS6_68ELS6_45ELS6_248ELS6_27ELS6_191ELS6_7ELS6_108ELS6_219ELS6_172ELS6_37ELS6_19ELS6_63ELS6_153ELS6_217ELS6_138ELS6_158ELS6_211ELS6_76ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_225ELS6_85ELS6_87ELS6_205ELS6_92ELS6_226ELS6_88ELS6_244ELS6_121ELS6_223ELS6_214ELS6_220ELS6_101ELS6_20ELS6_237ELS6_246ELS6_215ELS6_237ELS6_91ELS6_33ELS6_252ELS6_250ELS6_74ELS6_3ELS6_143ELS6_214ELS6_159ELS6_6ELS6_184ELS6_58ELS6_199ELS6_110ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_32ELS6_35ELS6_179ELS6_224ELS6_171ELS6_7ELS6_30ELS6_177ELS6_29ELS6_226ELS6_235ELS6_28ELS6_195ELS6_166ELS6_114ELS6_97ELS6_184ELS6_102ELS6_248ELS6_107ELS6_246ELS6_134ELS6_125ELS6_69ELS6_88ELS6_22ELS6_95ELS6_124ELS6_140ELS6_138ELS6_202ELS6_45ELS6_134ELS6_2ELS6_33ELS6_0ELS6_220ELS6_110ELS6_31ELS6_83ELS6_169ELS6_29ELS6_227ELS6_239ELS6_232ELS6_246ELS6_53ELS6_18ELS6_133ELS6_8ELS6_17ELS6_242ELS6_98ELS6_132ELS6_182ELS6_47ELS6_133ELS6_12ELS6_112ELS6_202ELS6_115ELS6_237ELS6_93ELS6_232ELS6_119ELS6_31ELS6_180ELS6_81ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_43ELS6_107ELS6_167ELS6_201ELS6_215ELS6_150ELS6_183ELS6_94ELS6_239ELS6_121ELS6_66ELS6_252ELS6_146ELS6_136ELS6_237ELS6_211ELS6_124ELS6_50ELS6_245ELS6_195ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_102ELS6_215ELS6_87ELS6_113ELS6_99ELS6_201ELS6_50ELS6_180ELS6_249ELS6_105ELS6_12ELS6_166ELS6_168ELS6_11ELS6_110ELS6_78ELS6_176ELS6_1ELS6_240ELS6_162ELS6_250ELS6_144ELS6_35ELS6_223ELS6_85ELS6_149ELS6_96ELS6_42ELS6_174ELS6_150ELS6_237ELS6_141ELS6_0ELS6_0ELS6_0ELS6_0ELS6_138ELS6_71ELS6_48ELS6_68ELS6_2ELS6_32ELS6_38ELS6_43ELS6_66ELS6_84ELS6_99ELS6_2ELS6_223ELS6_182ELS6_84ELS6_162ELS6_41ELS6_206ELS6_252ELS6_134ELS6_67ELS6_43ELS6_137ELS6_98ELS6_143ELS6_242ELS6_89ELS6_220ELS6_135ELS6_237ELS6_209ELS6_21ELS6_69ELS6_53ELS6_177ELS6_106ELS6_103ELS6_225ELS6_2ELS6_32ELS6_123ELS6_70ELS6_52ELS6_192ELS6_32ELS6_169ELS6_124ELS6_62ELS6_123ELS6_189ELS6_13ELS6_77ELS6_25ELS6_218ELS6_106ELS6_162ELS6_38ELS6_154ELS6_217ELS6_221ELS6_237ELS6_64ELS6_38ELS6_232ELS6_150ELS6_178ELS6_19ELS6_215ELS6_60ELS6_164ELS6_182ELS6_63ELS6_1ELS6_65ELS6_4ELS6_151ELS6_155ELS6_130ELS6_208ELS6_34ELS6_38ELS6_179ELS6_164ELS6_89ELS6_117ELS6_35ELS6_132ELS6_87ELS6_84ELS6_212ELS6_79ELS6_19ELS6_99ELS6_158ELS6_59ELS6_242ELS6_223ELS6_94ELS6_130ELS6_198ELS6_170ELS6_178ELS6_189ELS6_199ELS6_150ELS6_135ELS6_54ELS6_139ELS6_1ELS6_177ELS6_171ELS6_139ELS6_25ELS6_135ELS6_90ELS6_227ELS6_201ELS6_13ELS6_102ELS6_26ELS6_61ELS6_10ELS6_51ELS6_22ELS6_29ELS6_171ELS6_41ELS6_147ELS6_78ELS6_222ELS6_179ELS6_106ELS6_160ELS6_25ELS6_118ELS6_190ELS6_59ELS6_175ELS6_138ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_72ELS6_84ELS6_230ELS6_149ELS6_160ELS6_42ELS6_240ELS6_174ELS6_172ELS6_184ELS6_35ELS6_204ELS6_188ELS6_39ELS6_33ELS6_52ELS6_86ELS6_30ELS6_10ELS6_22ELS6_136ELS6_172ELS6_64ELS6_66ELS6_15ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_171ELS6_238ELS6_147ELS6_55ELS6_109ELS6_107ELS6_55ELS6_181ELS6_194ELS6_148ELS6_6ELS6_85ELS6_166ELS6_252ELS6_175ELS6_28ELS6_142ELS6_116ELS6_35ELS6_121ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_78ELS6_63ELS6_142ELS6_242ELS6_233ELS6_19ELS6_73ELS6_169ELS6_5ELS6_156ELS6_180ELS6_240ELS6_30ELS6_84ELS6_171ELS6_37ELS6_151ELS6_193ELS6_56ELS6_113ELS6_97ELS6_211ELS6_218ELS6_137ELS6_145ELS6_159ELS6_126ELS6_166ELS6_172ELS6_219ELS6_179ELS6_113ELS6_1ELS6_0ELS6_0ELS6_0ELS6_140ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_129ELS6_243ELS6_24ELS6_52ELS6_113ELS6_165ELS6_202ELS6_34ELS6_48ELS6_124ELS6_8ELS6_0ELS6_34ELS6_111ELS6_62ELS6_249ELS6_195ELS6_83ELS6_6ELS6_158ELS6_7ELS6_115ELS6_172ELS6_118ELS6_187ELS6_88ELS6_6ELS6_84ELS6_213ELS6_106ELS6_165ELS6_35ELS6_2ELS6_33ELS6_0ELS6_212ELS6_197ELS6_100ELS6_101ELS6_189ELS6_192ELS6_105ELS6_6ELS6_8ELS6_70ELS6_244ELS6_251ELS6_242ELS6_246ELS6_178ELS6_5ELS6_32ELS6_178ELS6_168ELS6_11ELS6_8ELS6_177ELS6_104ELS6_179ELS6_30ELS6_102ELS6_221ELS6_185ELS6_198ELS6_148ELS6_226ELS6_64ELS6_1ELS6_65ELS6_4ELS6_151ELS6_108ELS6_121ELS6_132ELS6_142ELS6_24ELS6_37ELS6_22ELS6_18ELS6_248ELS6_148ELS6_8ELS6_117ELS6_178ELS6_176ELS6_141ELS6_6ELS6_230ELS6_220ELS6_115ELS6_185ELS6_132ELS6_14ELS6_136ELS6_96ELS6_192ELS6_102ELS6_183ELS6_232ELS6_116ELS6_50ELS6_196ELS6_119ELS6_233ELS6_165ELS6_154ELS6_69ELS6_62ELS6_113ELS6_230ELS6_215ELS6_109ELS6_95ELS6_227ELS6_64ELS6_88ELS6_184ELS6_0ELS6_160ELS6_152ELS6_252ELS6_23ELS6_64ELS6_206ELS6_48ELS6_18ELS6_232ELS6_252ELS6_138ELS6_0ELS6_201ELS6_106ELS6_249ELS6_102ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_192ELS6_225ELS6_228ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_65ELS6_52ELS6_231ELS6_90ELS6_111ELS6_203ELS6_96ELS6_66ELS6_3ELS6_74ELS6_171ELS6_94ELS6_24ELS6_87ELS6_12ELS6_241ELS6_248ELS6_68ELS6_245ELS6_71ELS6_136ELS6_172ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_43ELS6_107ELS6_167ELS6_201ELS6_215ELS6_150ELS6_183ELS6_94ELS6_239ELS6_121ELS6_66ELS6_252ELS6_146ELS6_136ELS6_237ELS6_211ELS6_124ELS6_50ELS6_245ELS6_195ELS6_136ELS6_172EEEEEEEDav Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm337EEEtlSt5arrayISt4byteLm168EEtlA168_S6_LS6_96ELS6_1ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_254ELS6_255ELS6_255ELS6_127ELS6_1ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_47ELS6_85ELS6_82ELS6_71ELS6_69ELS6_78ELS6_84ELS6_58ELS6_32ELS6_65ELS6_108ELS6_101ELS6_114ELS6_116ELS6_32ELS6_107ELS6_101ELS6_121ELS6_32ELS6_99ELS6_111ELS6_109ELS6_112ELS6_114ELS6_111ELS6_109ELS6_105ELS6_115ELS6_101ELS6_100ELS6_44ELS6_32ELS6_117ELS6_112ELS6_103ELS6_114ELS6_97ELS6_100ELS6_101ELS6_32ELS6_114ELS6_101ELS6_113ELS6_117ELS6_105ELS6_114ELS6_101ELS6_100ELS6_0ELS6_70ELS6_48ELS6_68ELS6_2ELS6_32ELS6_101ELS6_63ELS6_235ELS6_214ELS6_65ELS6_15ELS6_71ELS6_15ELS6_107ELS6_174ELS6_17ELS6_202ELS6_209ELS6_156ELS6_72ELS6_65ELS6_59ELS6_236ELS6_177ELS6_172ELS6_44ELS6_23ELS6_249ELS6_8ELS6_253ELS6_15ELS6_213ELS6_59ELS6_220ELS6_58ELS6_189ELS6_82ELS6_2ELS6_32ELS6_109ELS6_14ELS6_156ELS6_150ELS6_254ELS6_136ELS6_212ELS6_160ELS6_240ELS6_30ELS6_217ELS6_222ELS6_218ELS6_226ELS6_182ELS6_249ELS6_224ELS6_13ELS6_169ELS6_76ELS6_173ELS6_15ELS6_236ELS6_170ELS6_230ELS6_110ELS6_207ELS6_104ELS6_155ELS6_247ELS6_27ELS6_80EEEEEEEDav |
432 | | |
433 | | template <util::detail::Hex str> |
434 | 0 | constexpr auto operator""_hex_u8() { return std::bit_cast<std::array<uint8_t, str.bytes.size()>>(str.bytes); } |
435 | | |
436 | | template <util::detail::Hex str> |
437 | | constexpr auto operator""_hex_v() { return std::vector<std::byte>{str.bytes.begin(), str.bytes.end()}; } |
438 | | |
439 | | template <util::detail::Hex str> |
440 | 0 | inline auto operator""_hex_v_u8() { return std::vector<uint8_t>{UCharCast(str.bytes.data()), UCharCast(str.bytes.data() + str.bytes.size())}; } |
441 | | |
442 | | } // inline namespace hex_literals |
443 | | } // namespace util |
444 | | |
445 | | #endif // BITCOIN_UTIL_STRENCODINGS_H |