15template<
typename String = di::TransparentString>
16requires(concepts::SameAs<meta::Encoding<String>, container::string::TransparentEncoding>)
33 constexpr static auto hex_digit(
u8 value) ->
c32 {
35 return c32(
'A' + (value - 10));
37 return c32(
'0' + value);
41 if ((
'0'_mc -
'9'_mc)(value)) {
44 if ((
'A'_mc -
'F'_mc)(value)) {
45 return u8(10u + (value -
'A'));
47 if ((
'a'_mc -
'f'_mc)(value)) {
48 return u8(10u + (value -
'a'));
53 template<concepts::Encoding Enc>
58 constexpr auto allowed =
59 (
'0'_mc -
'9'_mc ||
'a'_mc -
'z'_mc ||
'A'_mc -
'Z'_mc ||
'-'_mc ||
'.'_mc ||
'_'_mc ||
'~'_mc);
61 for (
auto ch : percent_encoded.m_string) {
63 (void) context.output(ch);
65 (void) context.output(U
'%');
66 (void) context.output(hex_digit(
u8(ch) >> 4));
67 (void) context.output(hex_digit(
u8(ch) & 0xFu));
77 constexpr auto valid_base64 = (
'\0'_m -
'\x7f'_m);
84 auto expected_chars = 0;
85 auto accumulator =
u8(0);
86 for (
auto ch : results) {
87 if (expected_chars > 0) {
89 auto value = hex_value(ch);
93 accumulator |= value.value();
95 if (--expected_chars == 0) {
96 result.m_string.push_back(
char(accumulator));
105 result.m_string.push_back(ch);
107 if (expected_chars > 0) {
119inline namespace literals {
135#if !defined(DI_NO_GLOBALS) && !defined(DI_NO_GLOBAL_PERCENT_ENCODED_LITERALS)
Definition format_parse_context.h:14
Helper class for performing percent encoding.
Definition percent_encoded.h:17
static constexpr auto from_raw_data(String string) -> PercentEncoded
Definition percent_encoded.h:23
constexpr friend auto tag_invoke(types::Tag< parser::create_parser_in_place >, InPlaceType< PercentEncoded >)
Definition percent_encoded.h:75
constexpr friend auto tag_invoke(types::Tag< format::formatter_in_place >, InPlaceType< PercentEncoded >, FormatParseContext< Enc > &)
Definition percent_encoded.h:54
constexpr auto underlying_string() const &-> String const &
Definition percent_encoded.h:25
auto operator==(PercentEncoded const &other) const -> bool=default
constexpr auto underlying_string() &&-> String &&
Definition percent_encoded.h:26
void IsAtom
Definition percent_encoded.h:19
Definition optional_forward_declaration.h:5
Definition unexpected.h:14
Definition operations.h:34
Definition format_context.h:9
string::StringImpl< string::Utf8Encoding > String
Definition string.h:11
string::StringViewImpl< string::TransparentEncoding > TransparentStringView
Definition string_view.h:13
Definition percent_encoded.h:120
constexpr auto match_zero_or_more
Definition match_zero_or_more.h:48
constexpr auto parse_unchecked
Definition parse_unchecked.h:25
size_t usize
Definition integers.h:33
__UINT8_TYPE__ u8
Definition integers.h:9
char32_t c32
Definition char.h:6
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Expected< T, Error > Result
Definition result.h:8
Definition any_storable.h:9
constexpr auto size
Definition size.h:62
constexpr auto data
Definition data.h:51
PercentEncoded< di::TransparentStringView > PercentEncodedView
Definition percent_encoded.h:132
Definition in_place_type.h:5