17template<concepts::ContainerOf<
byte> Con = di::Vector<
byte>>
26 constexpr auto container() const& -> Con const& {
return m_container; }
27 constexpr auto container() && -> Con&& {
return di::move(m_container); }
32 constexpr static auto alphabet() {
37 for (
auto ch : range(
'A',
'Z' + 1)) {
40 for (
auto ch : range(
'a',
'z' + 1)) {
43 for (
auto ch : range(
'0',
'9' + 1)) {
52 constexpr static auto reverse_alphabet() {
54 for (
auto [i, v] : di::enumerate(alphabet())) {
62 constexpr static auto value_to_base64_digit(
u8 value) ->
char {
return reverse_alphabet()[
value]; }
64 constexpr static auto base64_digit_to_value(
char value) ->
u8 {
return alphabet()[
value]; }
66 template<concepts::Encoding Enc>
71 for (
auto&& range : di::chunk(base64.m_container, 3)) {
72 auto it =
begin(range);
79 auto v0 = ((b0 & 0xfc) >> 2);
80 auto v1 = ((b0 & 0x03) << 4) | ((b1 & 0xf0) >> 4);
81 auto v2 = ((b1 & 0x0f) << 2) | ((b2 & 0xc0) >> 6);
82 auto v3 = ((b2 & 0x3f) << 0);
83 (void) context.output(value_to_base64_digit(v0));
84 (void) context.output(value_to_base64_digit(v1));
85 (void) context.output(value_to_base64_digit(v2));
86 (void) context.output(value_to_base64_digit(v3));
93 auto v0 = ((b0 & 0xfc) >> 2);
94 auto v1 = ((b0 & 0x03) << 4) | ((b1 & 0xf0) >> 4);
95 auto v2 = ((b1 & 0x0f) << 2);
96 (void) context.output(value_to_base64_digit(v0));
97 (void) context.output(value_to_base64_digit(v1));
98 (void) context.output(value_to_base64_digit(v2));
99 (void) context.output(
'=');
105 auto v0 = (b0 & 0xfc) >> 2;
106 auto v1 = (b0 & 0x03) << 4;
107 (void) context.output(value_to_base64_digit(v0));
108 (void) context.output(value_to_base64_digit(v1));
109 (void) context.output(
'=');
110 (void) context.output(
'=');
122 auto valid_base64 = (
'0'_m -
'9'_m ||
'a'_m -
'z'_m ||
'A'_m -
'Z'_m ||
'+'_m ||
'/'_m ||
'='_m);
125 << []<
typename Context>(
129 auto got_equal =
false;
130 for (
auto group : chunk(results, 4)) {
135 auto it =
begin(group);
145 if (got_equal && c2 !=
'=') {
148 got_equal |= c2 ==
'=';
150 if (got_equal && c3 !=
'=') {
153 got_equal |= c3 ==
'=';
155 auto v0 = base64_digit_to_value(
char(c0));
156 auto v1 = base64_digit_to_value(
char(c1));
157 auto v2 = base64_digit_to_value(
char(c2));
158 auto v3 = base64_digit_to_value(
char(c3));
160 auto b0 = ((v0 & 0x3f) << 2) | ((v1 & 0x30) >> 4);
161 auto b1 = ((v1 & 0x0f) << 4) | ((v2 & 0x3c) >> 2);
162 auto b2 = ((v2 & 0x03) << 6) | ((v3 & 0x3f) >> 0);
164 result.m_container.push_back(
byte(b0));
166 result.m_container.push_back(
byte(b1));
169 result.m_container.push_back(
byte(b2));
181inline namespace literals {
197#if !defined(DI_NO_GLOBALS) && !defined(DI_NO_GLOBAL_BASE64_LITERALS)
Definition format_parse_context.h:14
constexpr friend auto tag_invoke(types::Tag< parser::create_parser_in_place >, InPlaceType< Base64 >)
Definition base64.h:121
auto operator==(Base64 const &other) const -> bool=default
constexpr Base64(Con container)
Definition base64.h:24
constexpr friend auto tag_invoke(types::Tag< format::formatter_in_place >, InPlaceType< Base64 >, FormatParseContext< Enc > &)
Definition base64.h:67
void IsAtom
Definition base64.h:20
constexpr auto container() const &-> Con const &
Definition base64.h:26
constexpr auto container() &&-> Con &&
Definition base64.h:27
Definition unexpected.h:14
Definition operations.h:34
Definition format_context.h:9
string::StringViewImpl< string::TransparentEncoding > TransparentStringView
Definition string_view.h:13
constexpr auto value
Definition value.h:34
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
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 distance
Definition distance.h:44
constexpr auto size
Definition size.h:62
constexpr auto data
Definition data.h:51
Base64< di::Span< byte const > > Base64View
Definition base64.h:194
constexpr auto begin
Definition begin.h:52
Definition in_place_type.h:5
constexpr void fill(T const &value)
Definition array.h:88