26 #include <type_traits>
33 #if __cplusplus > 201103l
34 #define GRPC_PCTENCODE_CONSTEXPR_FN constexpr
35 #define GRPC_PCTENCODE_CONSTEXPR_VALUE constexpr
37 #define GRPC_PCTENCODE_CONSTEXPR_FN
38 #define GRPC_PCTENCODE_CONSTEXPR_VALUE const
44 class UrlTable :
public BitSet<256> {
47 for (
int i =
'a';
i <=
'z';
i++)
set(
i);
48 for (
int i =
'A';
i <=
'Z';
i++)
set(
i);
49 for (
int i =
'0';
i <=
'9';
i++)
set(
i);
59 class CompatibleTable :
public BitSet<256> {
62 for (
int i = 32;
i <= 126;
i++) {
63 if (
i ==
'%')
continue;
77 return g_compatible_table;
85 static const uint8_t hex[] =
"0123456789ABCDEF";
90 size_t output_length = 0;
91 bool any_reserved_bytes =
false;
93 bool unres = lut.
is_set(c);
94 output_length += unres ? 1 : 3;
95 any_reserved_bytes |= !unres;
98 if (!any_reserved_bytes) {
118 if (p >=
end)
return false;
119 return (*p >=
'0' && *p <=
'9') || (*p >=
'a' && *p <=
'f') ||
120 (*p >=
'A' && *p <=
'F');
124 if (c >=
'0' && c <=
'9')
return static_cast<uint8_t>(c -
'0');
125 if (c >=
'A' && c <=
'F')
return static_cast<uint8_t>(c -
'A' + 10);
126 if (c >=
'a' && c <=
'f')
return static_cast<uint8_t>(c -
'a' + 10);
131 bool any_percent_encoded_stuff =
false;
134 any_percent_encoded_stuff =
true;
138 if (!any_percent_encoded_stuff)
return slice_in;
156 return Slice(
out.TakeSubSlice(0, q -
out.begin()));